如何按路由名称访问CodeIgniter4路由元数据及权限校验
解决方案
1. 实现isAllowed($route_name)权限校验函数
你可以借助CodeIgniter的路由服务获取指定名称的路由元数据,再与当前用户角色做交集判断,具体实现如下:
步骤1:创建全局辅助函数
在app/Helpers目录下新建auth_helper.php,写入以下代码:
<?php if (!function_exists('isAllowed')) { function isAllowed(string $routeName): bool { $router = service('router'); // 通过路由名称获取对应路由信息 $route = $router->getRouteByName($routeName); if (!$route) { return false; } // 提取路由元数据中的允许角色列表 $allowedRoles = $route->getOptions()['allowed']['role'] ?? []; // 获取当前用户角色 $userRole = session()->get('user_role'); // 处理用户多角色场景,判断是否存在交集 if (is_array($userRole)) { return !empty(array_intersect($userRole, $allowedRoles)); } return in_array($userRole, $allowedRoles, true); } }
步骤2:启用辅助函数
在app/Config/Autoload.php的$helpers数组中添加auth:
public $helpers = ['auth'];
使用示例
在视图或任意位置直接调用:
<?php if (isAllowed('admin_users.admin_master_page')): ?> <a href="<?= route_to('admin_users.admin_master_page') ?>">用户管理主页</a> <?php endif; ?>
2. 通过路由组别名获取组内所有路由
CodeIgniter的路由组别名会自动作为前缀添加到子路由的as属性中(比如组别名admin_users下的子路由admin_master_page,最终路由名称为admin_users.admin_master_page),据此可以筛选出组内所有路由:
实现辅助函数
在auth_helper.php中添加以下函数:
if (!function_exists('getRoutesByGroupAlias')) { function getRoutesByGroupAlias(string $groupAlias): array { $router = service('router'); $allRoutes = $router->getRoutes(); $groupRoutes = []; $prefix = "{$groupAlias}."; $prefixLength = strlen($prefix); foreach ($allRoutes as $route) { $routeName = $route->getName(); // 筛选名称以组别名前缀开头的路由 if ($routeName && str_starts_with($routeName, $prefix)) { $groupRoutes[] = [ 'name' => $routeName, 'options' => $route->getOptions(), 'uri' => $route->getUri() ]; } } return $groupRoutes; } }
使用示例
获取admin_users组下的所有路由并渲染有权限的链接:
$userGroupRoutes = getRoutesByGroupAlias('admin_users'); foreach ($userGroupRoutes as $route) { if (isAllowed($route['name'])) { // 可给路由添加label元数据用于显示文本 echo "<a href='".route_to($route['name'])."'>{$route['options']['label']}</a>"; } }
优化建议
可以给路由新增label元数据,方便直接在视图中显示链接文本:
$routes->get('', 'AdminControllers\ViewController::users_main_page', [ 'as' => 'admin_master_page', 'allowed' => [ 'role' => ['admin', 'super_admin', 'owner'], ], 'label' => '用户管理主页' ]);
内容的提问来源于stack exchange,提问作者Black Devil
相关产品推荐
相关产品推荐

