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); // PHP 8.5 Safe Unpacking (Prevents "Undefined array key" crashes) $name = $directiveArguments[0] ?? "''"; $functionArguments = $directiveArguments[1] ?? ''; // 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); // PHP 8.5 Safe Loop Check return "slot({$name}, function({$functionArguments}) use ({$uses}) { \$loop = !empty(\$__env->getLoopStack()) ? (object) \$__env->getLoopStack()[0] : null; ?>"; }); Blade::directive('endscope', fn () => ''); } }