singleloginsystem/app/Providers/ScopeServiceProvider.php
= ca628fb009 feature: add role permission table for HR Manager
- Add TableHeader DTO
- Refactor Toggle component to have checked prop, as wire:model does not work
- add null collasing for php 8.5 strict compatibility in scope directive
- refactor card component so that actions stay on the right
- make button component scaled small on active and change color on hover
2026-05-11 07:17:03 +00:00

60 lines
2.1 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Providers;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Blade;
use Illuminate\Support\ServiceProvider;
final class ScopeServiceProvider extends ServiceProvider
{
/**
* Bootstrap services.
*/
public function boot(): void
{
$this->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 "<?php \$__bladeCompiler = \$__bladeCompiler ?? null; \$__env->slot({$name}, function({$functionArguments}) use ({$uses}) { \$loop = !empty(\$__env->getLoopStack()) ? (object) \$__env->getLoopStack()[0] : null; ?>";
});
Blade::directive("endscope", fn() => "<?php }); ?>");
}
}