Skip to content

Commit 2f9f35f

Browse files
[13.x] Add Authorize controller middleware attribute (#59048)
* Add Authorize controller middleware attribute * formatting --------- Co-authored-by: Taylor Otwell <taylor@laravel.com>
1 parent 33d3b85 commit 2f9f35f

File tree

2 files changed

+69
-0
lines changed

2 files changed

+69
-0
lines changed
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
3+
namespace Illuminate\Routing\Attributes\Controllers;
4+
5+
use Attribute;
6+
use Illuminate\Auth\Middleware\Authorize as AuthorizeMiddleware;
7+
use Illuminate\Support\Arr;
8+
use UnitEnum;
9+
10+
#[Attribute(Attribute::TARGET_CLASS | Attribute::TARGET_METHOD | Attribute::IS_REPEATABLE)]
11+
class Authorize extends Middleware
12+
{
13+
/**
14+
* @param array<string>|string|null $models
15+
*/
16+
public function __construct(
17+
UnitEnum|string $ability,
18+
array|string|null $models = null,
19+
?array $only = null,
20+
?array $except = null,
21+
) {
22+
$middleware = AuthorizeMiddleware::using($ability, ...Arr::wrap($models));
23+
24+
parent::__construct($middleware, $only, $except);
25+
}
26+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
3+
namespace Illuminate\Tests\Integration\Routing;
4+
5+
use Illuminate\Routing\Attributes\Controllers\Authorize;
6+
use Illuminate\Support\Facades\Route;
7+
use Orchestra\Testbench\TestCase;
8+
9+
class AuthorizeMiddlewareAttributeTest extends TestCase
10+
{
11+
public function test_attribute_is_respected(): void
12+
{
13+
$route = Route::get('/', [AuthorizeMiddlewareAttributeController::class, 'index']);
14+
$this->assertEquals([
15+
'Illuminate\Auth\Middleware\Authorize:all',
16+
'Illuminate\Auth\Middleware\Authorize:only-index,a',
17+
'Illuminate\Auth\Middleware\Authorize:also-index',
18+
], $route->controllerMiddleware());
19+
20+
$route = Route::get('/', [AuthorizeMiddlewareAttributeController::class, 'show']);
21+
$this->assertEquals([
22+
'Illuminate\Auth\Middleware\Authorize:all',
23+
'Illuminate\Auth\Middleware\Authorize:except-index,a,b',
24+
], $route->controllerMiddleware());
25+
}
26+
}
27+
28+
#[Authorize('all')]
29+
#[Authorize('only-index', 'a', only: ['index'])]
30+
#[Authorize('except-index', ['a', 'b'], except: ['index'])]
31+
class AuthorizeMiddlewareAttributeController
32+
{
33+
#[Authorize('also-index')]
34+
public function index(): void
35+
{
36+
// ...
37+
}
38+
39+
public function show(): void
40+
{
41+
// ...
42+
}
43+
}

0 commit comments

Comments
 (0)