【问题标题】:Are there any ways to get a list of all controller actions in all of your src bundles有什么方法可以获取所有 src 包中所有控制器操作的列表
【发布时间】:2023-03-23 12:19:01
【问题描述】:

背景故事:

使用 Symfony 2.2.1

我为附加到控制器操作的权限创建了一个自定义注释。例如:

/**
 * @Route("/", name="lg.user.usermanager.index")
 * @Template
 * @Permissions(perm="lg.user.usermanager.index", desc="Lists all users")
 */
public function indexAction(){ ... }

我设置了一个监听器,它附加到所有请求并检查用户是否有权访问该操作。例如,如果用户已被授予“lg.user.usermanager.*”权限,则该用户将有权访问与该模式匹配的所有操作。 lg.user.usermanager.create、lg.user.usermanager.index、lg.user.usermanager.edit 都会匹配。

考虑到这一点,路由参数也会被检查。所以

/**
 * ...
 * @Permissions(perm="lg.user.usermanager.edit", desc="Allows for a particular user to be editted")
 */
 public function editAction(User $user)

为了让用户能够编辑用户“test”,他们需要拥有“lg.user.usermanager.edit.test”或“lg.user.usermanager.edit.*”权限

问题:

现在我必须手动输入所有用户或组权限节点。我正在尝试想出一种方法,可以从可用节点列表中选择节点。我编写了一个非常原始的命令,它循环遍历我的所有文件并使用正则表达式匹配一个模式,该模式允许我提取节点和描述并将其更新到表中。

这个问题是它没有考虑可能的“*”节点,也没有考虑所有操作的附加参数。

可能的解决方案

我想要做的是能够以某种方式获取应用程序中所有控制器的列表(动态),然后使用注释阅读器获取我的权限注释和我检查的附加路由参数。有了这些,我觉得我可以设计一个允许我列出可用节点的解决方案。

但是,如果您知道或想要推荐更好的解决方案,我现在对任何事情都持开放态度。

【问题讨论】:

    标签: symfony doctrine-orm annotations


    【解决方案1】:

    我知道这是很久以前的事了,但也许对其他用户有帮助:

    虽然没有官方获取控制器的方法,但可以使用以下代码获取所有控制器:

    $bundles = $this->container->getParameter('kernel.bundles');
    $controllers = [];
    foreach ($bundles as $bundle) {
        $reflection = new \ReflectionClass($bundle);
        $controllerDirectory = dirname($reflection->getFileName()) . '/Controller';
        if (file_exists($controllerDirectory)) {
            $d = dir($controllerDirectory);
            while (false !== ($entry = $d->read())) {
    
                if (preg_match("/^([A-Z0-9-_]+Controller).php/i", $entry, $matches)) {                        
                    $controllers[] = ['fileName' => $controllerDirectory. '/'. $entry, 'class' => $reflection->getNamespaceName() . '\Controller\\' . $matches[1]];
                }
            }
            $d->close();
        }
    }
    print_r($controllers);
    

    【讨论】:

      猜你喜欢
      • 2010-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多