Symfony 有没有办法获得所有src包中所有控制器操作的列表

Symfony 有没有办法获得所有src包中所有控制器操作的列表,symfony,doctrine-orm,annotations,Symfony,Doctrine Orm,Annotations,背景故事: 使用Symfony 2.2.1 我已经为附加到控制器操作的权限创建了自定义注释。例: /** * @Route("/", name="lg.user.usermanager.index") * @Template * @Permissions(perm="lg.user.usermanager.index", desc="Lists all users") */ public function indexAction(){ ... } 我已经设置了一个侦听器,该侦听器连接到

背景故事:

使用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.*”

问题:

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

这样做的问题是,它不考虑可能的“*”节点,也不考虑所有操作和其他参数

可能的解决方案

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


不过,如果您知道或想推荐更好的解决方案,我愿意接受任何建议。

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

尽管没有官方方法获取控制器,但您可以使用以下代码获取所有控制器:

$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);