背景故事:
使用Symfony 2.2.1
我为附加到控制器操作的权限创建了自定义注释。 EX:
/**
* @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。*”
问题:
现在我必须手动输入所有用户或组权限节点。我试图想出一种方法,我可以从可用节点列表中选择节点。我编写了一个非常原始的命令,它循环遍历我的所有文件,并使用正则表达式匹配一个模式,允许我拉出节点和描述并将其更新到表中。
这个问题是它没有考虑可能的“*”节点,它也没有考虑所有动作的附加参数。
可能的解决方案
我想要做的是能够以某种方式获得应用程序内所有控制器的列表(动态),然后使用注释阅读器获取我的权限注释和我检查的添加路由参数。有了这些,我觉得我可以设计一个允许我列出可用节点的解决方案。
但是,如果您知道或想要推荐更好的解决方案,我现在可以接受任何事情。
答案 0 :(得分:3)
我知道很久以前,但也许对其他用户有帮助:
尽管没有获取控制器的正式方法,但您可以使用以下代码获取所有控制器:
$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);