diff --git a/config/permission.php b/config/permission.php index c23acb9ce..a62d1cd69 100644 --- a/config/permission.php +++ b/config/permission.php @@ -103,6 +103,14 @@ 'register_permission_check_method' => true, + /* + * When set to true, the Spatie\Permission\Listeners\OctaneReloadPermissions listener will be registered + * on the Laravel\Octane\Events\OperationTerminated event, this will refresh permissions on every + * TickTerminated, TaskTerminated and RequestTerminated + * NOTE: This should not be needed in most cases, but an Octane/Vapor combination benefited from it. + */ + 'register_octane_reset_listener' => false, + /* * Teams Feature. * When set to true the package implements teams using the 'team_foreign_key'. 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 639e7faa7..f2643cef0 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 */ @@ -85,6 +89,21 @@ protected function registerCommands(): void ]); } + protected function registerOctaneListener(): void + { + if ($this->app->runningInConsole() || ! $this->app['config']->get('permission.register_octane_reset_listener')) { + return; + } + + if (! $this->app['config']->get('octane.listeners')) { + return; + } + + $dispatcher = $this->app[Dispatcher::class]; + // @phpstan-ignore-next-line + $dispatcher->listen(\Laravel\Octane\Events\OperationTerminated::class, OctaneReloadPermissions::class); + } + protected function registerModelBindings(): void { $this->app->bind(PermissionContract::class, fn ($app) => $app->make($app->config['permission.models.permission']));