Skip to content

Commit

Permalink
[V6] Register OctaneReloadPermissions listener for Laravel Octane (#2403
Browse files Browse the repository at this point in the history
)

* Register OctaneReloadPermissions listener for Laravel Octane

---------

Co-authored-by: Chris Brown <[email protected]>
  • Loading branch information
erikn69 and drbyte authored Aug 17, 2023
1 parent 0c2422b commit feb3014
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 0 deletions.
8 changes: 8 additions & 0 deletions config/permission.php
Original file line number Diff line number Diff line change
Expand Up @@ -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'.
Expand Down
13 changes: 13 additions & 0 deletions src/Listeners/OctaneReloadPermissions.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php

namespace Spatie\Permission\Listeners;

use Spatie\Permission\PermissionRegistrar;

class OctaneReloadPermissions
{
public function handle($event): void
{
$event->sandbox->make(PermissionRegistrar::class)->clearPermissionsCollection();
}
}
19 changes: 19 additions & 0 deletions src/PermissionServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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
{
Expand All @@ -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 */
Expand Down Expand Up @@ -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']));
Expand Down

0 comments on commit feb3014

Please sign in to comment.