registerScopeDirective(); } public function registerScopeDirective(): void { /** * All credits from this blade directive goes to Konrad Kalemba. * Just copied and modified for my very specific use case. * * https://github.com/konradkalemba/blade-components-scoped-slots */ Blade::directive('scope', function ($expression) { // Split the expression by `top-level` commas (not in parentheses) $directiveArguments = preg_split("/,(?![^\(\(]*[\)\)])/", $expression); $directiveArguments = array_map('trim', $directiveArguments); [$name, $functionArguments] = $directiveArguments; // Build function "uses" to inject extra external variables $uses = Arr::except(array_flip($directiveArguments), [$name, $functionArguments]); $uses = array_flip($uses); $uses[] = '$__env'; $uses[] = '$__bladeCompiler'; $uses = implode(',', $uses); /** * Slot names can`t contains dot , eg: `user.city`. * So we convert `user.city` to `user___city` * * Later, on component it will be replaced back. */ $name = str_replace('.', '___', $name); return "slot({$name}, function({$functionArguments}) use ({$uses}) { \$loop = !empty(\$__env->getLoopStack()) ? (object) \$__env->getLoopStack()[0] : null; ?>"; }); Blade::directive('endscope', fn() => ''); } }