offerPublishing(); $this->registerMacroHelpers(); $this->registerCommands(); $this->registerModelBindings(); if ($this->app->config['permission.register_permission_check_method']) { $permissionLoader->clearClassPermissions(); $permissionLoader->registerPermissions(); } $this->app->singleton(PermissionRegistrar::class, function ($app) use ($permissionLoader) { return $permissionLoader; }); } public function register() { $this->mergeConfigFrom( __DIR__.'/../config/permission.php', 'permission' ); $this->callAfterResolving('blade.compiler', function (BladeCompiler $bladeCompiler) { $this->registerBladeExtensions($bladeCompiler); }); } protected function offerPublishing() { if (! function_exists('config_path')) { // function not available and 'publish' not relevant in Lumen return; } $this->publishes([ __DIR__.'/../config/permission.php' => config_path('permission.php'), ], 'permission-config'); $this->publishes([ __DIR__.'/../database/migrations/create_permission_tables.php.stub' => $this->getMigrationFileName('create_permission_tables.php'), ], 'permission-migrations'); } protected function registerCommands() { $this->commands([ Commands\CacheReset::class, Commands\CreateRole::class, Commands\CreatePermission::class, Commands\Show::class, Commands\UpgradeForTeams::class, ]); } protected function registerModelBindings() { $config = $this->app->config['permission.models']; if (! $config) { return; } $this->app->bind(PermissionContract::class, $config['permission']); $this->app->bind(RoleContract::class, $config['role']); } public static function bladeMethodWrapper($method, $role, $guard = null) { return auth($guard)->check() && auth($guard)->user()->{$method}($role); } protected function registerBladeExtensions($bladeCompiler) { $bladeCompiler->directive('role', function ($arguments) { return ""; }); $bladeCompiler->directive('elserole', function ($arguments) { return ""; }); $bladeCompiler->directive('endrole', function () { return ''; }); $bladeCompiler->directive('hasrole', function ($arguments) { return ""; }); $bladeCompiler->directive('endhasrole', function () { return ''; }); $bladeCompiler->directive('hasanyrole', function ($arguments) { return ""; }); $bladeCompiler->directive('endhasanyrole', function () { return ''; }); $bladeCompiler->directive('hasallroles', function ($arguments) { return ""; }); $bladeCompiler->directive('endhasallroles', function () { return ''; }); $bladeCompiler->directive('unlessrole', function ($arguments) { return ""; }); $bladeCompiler->directive('endunlessrole', function () { return ''; }); $bladeCompiler->directive('hasexactroles', function ($arguments) { return ""; }); $bladeCompiler->directive('endhasexactroles', function () { return ''; }); } protected function registerMacroHelpers() { if (! method_exists(Route::class, 'macro')) { // Lumen return; } Route::macro('role', function ($roles = []) { $roles = implode('|', Arr::wrap($roles)); $this->middleware("role:$roles"); return $this; }); Route::macro('permission', function ($permissions = []) { $permissions = implode('|', Arr::wrap($permissions)); $this->middleware("permission:$permissions"); return $this; }); } /** * Returns existing migration file if found, else uses the current timestamp. */ protected function getMigrationFileName($migrationFileName): string { $timestamp = date('Y_m_d_His'); $filesystem = $this->app->make(Filesystem::class); return Collection::make($this->app->databasePath().DIRECTORY_SEPARATOR.'migrations'.DIRECTORY_SEPARATOR) ->flatMap(function ($path) use ($filesystem, $migrationFileName) { return $filesystem->glob($path.'*_'.$migrationFileName); }) ->push($this->app->databasePath()."/migrations/{$timestamp}_{$migrationFileName}") ->first(); } }