Skip to content

Commit

Permalink
Add middleware using static method (#2424)
Browse files Browse the repository at this point in the history
* Allow static creation of middlewares with using method

* Add tests for creation of middleware with static using method

* Add example about static middleware methods to docs
  • Loading branch information
jnoordsij committed May 7, 2023
1 parent e64d2f9 commit 587ba9c
Show file tree
Hide file tree
Showing 8 changed files with 136 additions and 12 deletions.
30 changes: 29 additions & 1 deletion docs/basic-usage/middleware.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,18 @@ Route::group(['middleware' => ['can:publish articles']], function () {
});
```

In Laravel v10.9 and up, you can also call this middleware with a static method.

```php
Route::group(['middleware' => [\Illuminate\Auth\Middleware\Authorize::using('publish articles')]], function () {
//
});
```

## Package Middleware

This package comes with `RoleMiddleware`, `PermissionMiddleware` and `RoleOrPermissionMiddleware` middleware. You can add them inside your `app/Http/Kernel.php` file.
This package comes with `RoleMiddleware`, `PermissionMiddleware` and `RoleOrPermissionMiddleware` middleware.
You can add them inside your `app/Http/Kernel.php` file to be able to use them through aliases.

Note the property name difference between Laravel 10 and older versions of Laravel:

Expand Down Expand Up @@ -88,3 +97,22 @@ public function __construct()
```

(You can use Laravel's Model Policy feature with your controller methods. See the Model Policies section of these docs.)

## Use middleware static methods

All of the middlewares can also be applied by calling the static `using` method,
which accepts either a `|`-separated string or an array as input.

```php
Route::group(['middleware' => [\Spatie\Permission\Middlewares\RoleMiddleware::using('super-admin')]], function () {
//
});

Route::group(['middleware' => [\Spatie\Permission\Middlewares\PermissionMiddleware::using('publish articles|edit articles')]], function () {
//
});

Route::group(['middleware' => [\Spatie\Permission\Middlewares\RoleOrPermissionMiddleware::using(['super-admin', 'edit articles'])]], function () {
//
});
```
15 changes: 15 additions & 0 deletions src/Middlewares/PermissionMiddleware.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,19 @@ public function handle($request, Closure $next, $permission, $guard = null)

return $next($request);
}

/**
* Specify the permission and guard for the middleware.
*
* @param array|string $permission
* @param string|null $guard
* @return string
*/
public static function using($permission, $guard = null)
{
$permissionString = is_string($permission) ? $permission : implode('|', $permission);
$args = is_null($guard) ? $permissionString : "$permissionString,$guard";

return static::class.':'.$args;
}
}
15 changes: 15 additions & 0 deletions src/Middlewares/RoleMiddleware.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,4 +32,19 @@ public function handle($request, Closure $next, $role, $guard = null)

return $next($request);
}

/**
* Specify the role and guard for the middleware.
*
* @param array|string $role
* @param string|null $guard
* @return string
*/
public static function using($role, $guard = null)
{
$roleString = is_string($role) ? $role : implode('|', $role);
$args = is_null($guard) ? $roleString : "$roleString,$guard";

return static::class.':'.$args;
}
}
15 changes: 15 additions & 0 deletions src/Middlewares/RoleOrPermissionMiddleware.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,4 +31,19 @@ public function handle($request, Closure $next, $roleOrPermission, $guard = null

return $next($request);
}

/**
* Specify the role or permission and guard for the middleware.
*
* @param array|string $roleOrPermission
* @param string|null $guard
* @return string
*/
public static function using($roleOrPermission, $guard = null)
{
$roleOrPermissionString = is_string($roleOrPermission) ? $roleOrPermission : implode('|', $roleOrPermission);
$args = is_null($guard) ? $roleOrPermissionString : "$roleOrPermissionString,$guard";

return static::class.':'.$args;
}
}
17 changes: 17 additions & 0 deletions tests/PermissionMiddlewareTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -254,4 +254,21 @@ public function user_can_access_permission_with_guard_admin_while_login_using_ad
$this->runMiddleware($this->permissionMiddleware, 'admin-permission', 'admin')
);
}

/** @test */
public function the_middleware_can_be_created_with_static_using_method()
{
$this->assertSame(
'Spatie\Permission\Middlewares\PermissionMiddleware:edit-articles',
PermissionMiddleware::using('edit-articles')
);
$this->assertEquals(
'Spatie\Permission\Middlewares\PermissionMiddleware:edit-articles,my-guard',
PermissionMiddleware::using('edit-articles', 'my-guard')
);
$this->assertEquals(
'Spatie\Permission\Middlewares\PermissionMiddleware:edit-articles|edit-news',
PermissionMiddleware::using(['edit-articles', 'edit-news'])
);
}
}
17 changes: 17 additions & 0 deletions tests/RoleMiddlewareTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -204,4 +204,21 @@ public function user_can_access_role_with_guard_admin_while_login_using_admin_gu
$this->runMiddleware($this->roleMiddleware, 'testAdminRole', 'admin')
);
}

/** @test */
public function the_middleware_can_be_created_with_static_using_method()
{
$this->assertSame(
'Spatie\Permission\Middlewares\RoleMiddleware:testAdminRole',
RoleMiddleware::using('testAdminRole')
);
$this->assertEquals(
'Spatie\Permission\Middlewares\RoleMiddleware:testAdminRole,my-guard',
RoleMiddleware::using('testAdminRole', 'my-guard')
);
$this->assertEquals(
'Spatie\Permission\Middlewares\RoleMiddleware:testAdminRole|anotherRole',
RoleMiddleware::using(['testAdminRole', 'anotherRole'])
);
}
}
17 changes: 17 additions & 0 deletions tests/RoleOrPermissionMiddlewareTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -194,4 +194,21 @@ public function the_required_permissions_or_roles_can_be_displayed_in_the_except

$this->assertStringEndsWith('Necessary roles or permissions are some-permission, some-role', $message);
}

/** @test */
public function the_middleware_can_be_created_with_static_using_method()
{
$this->assertSame(
'Spatie\Permission\Middlewares\RoleOrPermissionMiddleware:edit-articles',
RoleOrPermissionMiddleware::using('edit-articles')
);
$this->assertEquals(
'Spatie\Permission\Middlewares\RoleOrPermissionMiddleware:edit-articles,my-guard',
RoleOrPermissionMiddleware::using('edit-articles', 'my-guard')
);
$this->assertEquals(
'Spatie\Permission\Middlewares\RoleOrPermissionMiddleware:edit-articles|testAdminRole',
RoleOrPermissionMiddleware::using(['edit-articles', 'testAdminRole'])
);
}
}
22 changes: 11 additions & 11 deletions tests/TestCase.php
Original file line number Diff line number Diff line change
Expand Up @@ -243,15 +243,15 @@ public function getLastRouteMiddlewareFromRouter($router)
return last($router->getRoutes()->get())->middleware();
}

public function getRouter()
{
return app('router');
}

public function getRouteResponse()
{
return function () {
return (new Response())->setContent('<html></html>');
};
}
public function getRouter()
{
return app('router');
}

public function getRouteResponse()
{
return function () {
return (new Response())->setContent('<html></html>');
};
}
}

0 comments on commit 587ba9c

Please sign in to comment.