基于 PHP 反射的权限导入
之前公司的项目中的管理后台权限控制模块,是用PHP反射获取类方法注释中的权限名,但是是用公司内部的框架实现的,没有在laravel上试过,所以想重新撸一个轮子,废话不多说,开撸~~ (文采太烂,导致废话少)
先来看看,最终想要达成的效果
- 权限列表
- 一键导入权限
- 控制器注释
<?php
/**
* @module 菜单管理
*/
class MenuController
{
/**
* @permission菜单列表
*/
public function index()
{
...
}
}
控制器作为一个权限集合模块,控制器方法为单个权限,上面的@permission菜单列表
其实中间有一个空格,编辑保存的时候总会自动给我加上个链接,不晓得为什么,难道不小心使用了本论坛的特殊命令 :joy:
接下来是权限提取
<?php
namespace Tanmo\Admin\Classes;
use Illuminate\Routing\Route;
use Illuminate\Routing\Router;
class Permissions
{
/**
* @var \Illuminate\Routing\RouteCollection
*/
protected $routes;
/**
* @var string
*/
protected $filterNamespace;
/**
* @var string
*/
protected $moduleTag;
/**
* @var string
*/
protected $permissionTag;
/**
* Permissions constructor.
* @param Router $router
*/
public function __construct(Router $router)
{
$this->routes = $router->getRoutes();
$this->filterNamespace = config('admin.namespace');
$this->moduleTag = '@module';
$this->permissionTag = '[@permission](https://learnku.com/users/3492)';
}
/**
* @return array
*/
public function getAllPermissions()
{
$routes = $this->getRoutes();
$res = [];
foreach ($routes as &$route) {
$ref = new \ReflectionClass($route['controller']);
$classDoc = $ref->getDocComment();
if ($classDoc != false && $module = $this->getModule($classDoc)) {
$methodDoc = $ref->getMethod($route['action'])->getDocComment();
if ($methodDoc != false && ($name = $this->getPermission($methodDoc))) {
///
$permission = $route;
$permission['module'] = $module;
$permission['name'] = $name;
///
$res[] = $permission;
}
}
}
return $res;
}
...
}
- 通过
$filterNamespace
来提取需要扫描权限的命名空间下的路由,获取到该路由绑定的控制器名
方法名
uri
, 然后用反射类的getDocComment()
方法来获取控制器方法的注释,提取出module标签
和permission标签
- 将扫描到的权限导入数据库
第一次写文章,轻喷~,写的不到位的,请指出,我改 :joy:
因为没有找到laravel下,类似这种实现方式的权限控制包,所以自己撸一个,还不完善,思路也是来自于之前公司的项目,不是我发明的 :satisfied:
本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 6年前 自动加精
这么骚的吗?