Skip to content

Commit 71e62a6

Browse files
authored
Merge pull request spatie#2823 from Yi-pixel/route-macro-function-enums-support
Route macro functions add backed enum support
2 parents 0268734 + 759f15c commit 71e62a6

File tree

2 files changed

+72
-2
lines changed

2 files changed

+72
-2
lines changed

src/PermissionServiceProvider.php

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,13 +149,19 @@ protected function registerMacroHelpers(): void
149149
}
150150

151151
Route::macro('role', function ($roles = []) {
152+
$roles = Arr::wrap($roles);
153+
$roles = array_map(fn ($role) => $role instanceof \BackedEnum ? $role->value : $role, $roles);
154+
152155
/** @var Route $this */
153-
return $this->middleware('role:'.implode('|', Arr::wrap($roles)));
156+
return $this->middleware('role:'.implode('|', $roles));
154157
});
155158

156159
Route::macro('permission', function ($permissions = []) {
160+
$permissions = Arr::wrap($permissions);
161+
$permissions = array_map(fn ($permission) => $permission instanceof \BackedEnum ? $permission->value : $permission, $permissions);
162+
157163
/** @var Route $this */
158-
return $this->middleware('permission:'.implode('|', Arr::wrap($permissions)));
164+
return $this->middleware('permission:'.implode('|', $permissions));
159165
});
160166
}
161167

tests/RouteTest.php

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
namespace Spatie\Permission\Tests;
44

5+
use PHPUnit\Framework\Attributes\RequiresPhp;
56
use PHPUnit\Framework\Attributes\Test;
7+
use Spatie\Permission\Tests\TestModels\TestRolePermissionsEnum;
68

79
class RouteTest extends TestCase
810
{
@@ -51,4 +53,66 @@ public function test_role_and_permission_function_together()
5153
$this->getLastRouteMiddlewareFromRouter($router)
5254
);
5355
}
56+
57+
/**
58+
* @test
59+
*
60+
* @requires PHP 8.1.0
61+
*/
62+
#[RequiresPhp('>= 8.1.0')]
63+
#[Test]
64+
public function test_role_function_with_backed_enum()
65+
{
66+
$router = $this->getRouter();
67+
68+
$router->get('role-test.enum', $this->getRouteResponse())
69+
->name('role.test.enum')
70+
->role(TestRolePermissionsEnum::USERMANAGER);
71+
72+
$this->assertEquals(['role:'.TestRolePermissionsEnum::USERMANAGER->value], $this->getLastRouteMiddlewareFromRouter($router));
73+
}
74+
75+
/**
76+
* @test
77+
*
78+
* @requires PHP 8.1.0
79+
*/
80+
#[RequiresPhp('>= 8.1.0')]
81+
#[Test]
82+
public function test_permission_function_with_backed_enum()
83+
{
84+
$router = $this->getRouter();
85+
86+
$router->get('permission-test.enum', $this->getRouteResponse())
87+
->name('permission.test.enum')
88+
->permission(TestRolePermissionsEnum::WRITER);
89+
90+
$expected = ['permission:'.TestRolePermissionsEnum::WRITER->value];
91+
$this->assertEquals($expected, $this->getLastRouteMiddlewareFromRouter($router));
92+
}
93+
94+
/**
95+
* @test
96+
*
97+
* @requires PHP 8.1.0
98+
*/
99+
#[RequiresPhp('>= 8.1.0')]
100+
#[Test]
101+
public function test_role_and_permission_function_together_with_backed_enum()
102+
{
103+
$router = $this->getRouter();
104+
105+
$router->get('roles-permissions-test.enum', $this->getRouteResponse())
106+
->name('roles-permissions.test.enum')
107+
->role([TestRolePermissionsEnum::USERMANAGER, TestRolePermissionsEnum::ADMIN])
108+
->permission([TestRolePermissionsEnum::WRITER, TestRolePermissionsEnum::EDITOR]);
109+
110+
$this->assertEquals(
111+
[
112+
'role:'.TestRolePermissionsEnum::USERMANAGER->value.'|'.TestRolePermissionsEnum::ADMIN->value,
113+
'permission:'.TestRolePermissionsEnum::WRITER->value.'|'.TestRolePermissionsEnum::EDITOR->value,
114+
],
115+
$this->getLastRouteMiddlewareFromRouter($router)
116+
);
117+
}
54118
}

0 commit comments

Comments
 (0)