singleloginsystem/app/Providers/ScopeServiceProvider.php
= 105123bb74 chore: introduce role management functionality with DTOs and Livewire components
- Added Role and User DTOs for dynamic role handling.
- Implemented table and badge components for displaying role data.
- Registered a Blade directive for scoped slots in `ScopeServiceProvider`.
- Updated dashboard views to include role management section.
2026-05-08 13:15:00 +00:00

56 lines
1.9 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);
[$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 "<?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 }); ?>');
}
}