Skip to content

Commit 70b12bf

Browse files
authored
Merge pull request #2893 from imhayatunnabi/feat/role-permission-route-macro
Add Missing roleOrPermission() route macro
2 parents 8eb9577 + 440d1c1 commit 70b12bf

File tree

2 files changed

+73
-0
lines changed

2 files changed

+73
-0
lines changed

src/PermissionServiceProvider.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,14 @@ protected function registerMacroHelpers(): void
164164
/** @var Route $this */
165165
return $this->middleware('permission:'.implode('|', $permissions));
166166
});
167+
168+
Route::macro('roleOrPermission', function ($rolesOrPermissions = []) {
169+
$rolesOrPermissions = Arr::wrap($rolesOrPermissions);
170+
$rolesOrPermissions = array_map(fn ($item) => $item instanceof \BackedEnum ? $item->value : $item, $rolesOrPermissions);
171+
172+
/** @var Route $this */
173+
return $this->middleware('role_or_permission:'.implode('|', $rolesOrPermissions));
174+
});
167175
}
168176

169177
/**

tests/RouteTest.php

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,4 +115,69 @@ public function test_role_and_permission_function_together_with_backed_enum()
115115
$this->getLastRouteMiddlewareFromRouter($router)
116116
);
117117
}
118+
119+
/** @test */
120+
#[Test]
121+
public function test_role_or_permission_function()
122+
{
123+
$router = $this->getRouter();
124+
125+
$router->get('role-or-permission-test', $this->getRouteResponse())
126+
->name('role-or-permission.test')
127+
->roleOrPermission('admin|edit articles');
128+
129+
$this->assertEquals(['role_or_permission:admin|edit articles'], $this->getLastRouteMiddlewareFromRouter($router));
130+
}
131+
132+
/** @test */
133+
#[Test]
134+
public function test_role_or_permission_function_with_array()
135+
{
136+
$router = $this->getRouter();
137+
138+
$router->get('role-or-permission-array-test', $this->getRouteResponse())
139+
->name('role-or-permission-array.test')
140+
->roleOrPermission(['admin', 'edit articles']);
141+
142+
$this->assertEquals(['role_or_permission:admin|edit articles'], $this->getLastRouteMiddlewareFromRouter($router));
143+
}
144+
145+
/**
146+
* @test
147+
*
148+
* @requires PHP 8.1.0
149+
*/
150+
#[RequiresPhp('>= 8.1.0')]
151+
#[Test]
152+
public function test_role_or_permission_function_with_backed_enum()
153+
{
154+
$router = $this->getRouter();
155+
156+
$router->get('role-or-permission-test.enum', $this->getRouteResponse())
157+
->name('role-or-permission.test.enum')
158+
->roleOrPermission(TestRolePermissionsEnum::USERMANAGER);
159+
160+
$this->assertEquals(['role_or_permission:'.TestRolePermissionsEnum::USERMANAGER->value], $this->getLastRouteMiddlewareFromRouter($router));
161+
}
162+
163+
/**
164+
* @test
165+
*
166+
* @requires PHP 8.1.0
167+
*/
168+
#[RequiresPhp('>= 8.1.0')]
169+
#[Test]
170+
public function test_role_or_permission_function_with_backed_enum_array()
171+
{
172+
$router = $this->getRouter();
173+
174+
$router->get('role-or-permission-array-test.enum', $this->getRouteResponse())
175+
->name('role-or-permission-array.test.enum')
176+
->roleOrPermission([TestRolePermissionsEnum::USERMANAGER, TestRolePermissionsEnum::EDITARTICLES]); // @phpstan-ignore-line
177+
178+
$this->assertEquals(
179+
['role_or_permission:'.TestRolePermissionsEnum::USERMANAGER->value.'|'.TestRolePermissionsEnum::EDITARTICLES->value], // @phpstan-ignore-line
180+
$this->getLastRouteMiddlewareFromRouter($router)
181+
);
182+
}
118183
}

0 commit comments

Comments
 (0)