Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add middleware using static method #2424

Merged
merged 4 commits into from
May 7, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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.
drbyte marked this conversation as resolved.
Show resolved Hide resolved

```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);
jnoordsij marked this conversation as resolved.
Show resolved Hide resolved
$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>');
};
}
}