diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index a1b0ec7db..aa928fe3d 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -4,4 +4,10 @@ parameters: # PHPStan can't understand what's going on in context of Role class using Builder `when` message: "#^Call to an undefined method Spatie\\\\Permission\\\\Models\\\\Role::getRoleClass\\(\\).$#" count: 1 - path: src\Traits\HasPermissions.php + path: src/Traits/HasPermissions.php + + - + # Laravel Octane is not available for PHPStan + message: "#^Class Laravel\\\\Octane\\\\Events\\\\[a-zA-Z]+ not found\\.$#" + count: 3 + path: src/PermissionServiceProvider.php diff --git a/src/Listeners/OctaneReloadPermissions.php b/src/Listeners/OctaneReloadPermissions.php new file mode 100644 index 000000000..6f4544e5e --- /dev/null +++ b/src/Listeners/OctaneReloadPermissions.php @@ -0,0 +1,13 @@ +sandbox->make(PermissionRegistrar::class)->clearPermissionsCollection(); + } +} diff --git a/src/PermissionServiceProvider.php b/src/PermissionServiceProvider.php index 16e8f3287..365b4163d 100644 --- a/src/PermissionServiceProvider.php +++ b/src/PermissionServiceProvider.php @@ -3,6 +3,7 @@ namespace Spatie\Permission; use Illuminate\Contracts\Auth\Access\Gate; +use Illuminate\Contracts\Events\Dispatcher; use Illuminate\Contracts\Foundation\Application; use Illuminate\Filesystem\Filesystem; use Illuminate\Routing\Route; @@ -12,6 +13,7 @@ use Illuminate\View\Compilers\BladeCompiler; use Spatie\Permission\Contracts\Permission as PermissionContract; use Spatie\Permission\Contracts\Role as RoleContract; +use Spatie\Permission\Listeners\OctaneReloadPermissions; class PermissionServiceProvider extends ServiceProvider { @@ -25,6 +27,8 @@ public function boot() $this->registerModelBindings(); + $this->registerOctaneListener(); + $this->callAfterResolving(Gate::class, function (Gate $gate, Application $app) { if ($this->app['config']->get('permission.register_permission_check_method')) { /** @var PermissionRegistrar $permissionLoader */ @@ -79,6 +83,17 @@ protected function registerCommands() ]); } + protected function registerOctaneListener() + { + if (! $this->app->runningInConsole() && $this->app['config']->get('octane.listeners')) { + $dispatcher = $this->app[Dispatcher::class]; + + $dispatcher->listen(\Laravel\Octane\Events\RequestReceived::class, OctaneReloadPermissions::class); + $dispatcher->listen(\Laravel\Octane\Events\TaskReceived::class, OctaneReloadPermissions::class); + $dispatcher->listen(\Laravel\Octane\Events\TickReceived::class, OctaneReloadPermissions::class); + } + } + protected function registerModelBindings() { $this->app->bind(PermissionContract::class, fn ($app) => $app->make($app->config['permission.models.permission'])