基于 PHP 反射的权限导入

之前公司的项目中的管理后台权限控制模块,是用PHP反射获取类方法注释中的权限名,但是是用公司内部的框架实现的,没有在laravel上试过,所以想重新撸一个轮子,废话不多说,开撸~~ (文采太烂,导致废话少)

先来看看,最终想要达成的效果

  • 权限列表
    file
  • 一键导入权限
    file
  • 控制器注释
<?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 协议》,转载必须注明作者和本文链接
黑将军(Tanmo)
本帖由系统于 6年前 自动加精
黑将军
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 1

这么的吗?

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!