Symfony2 - 获取捆绑包的所有控制器的方法?

时间:2013-12-16 12:09:48

标签: symfony controllers

有没有办法获得捆绑包的所有控制器(和类)?包括所有父控制器?

感谢的

2 个答案:

答案 0 :(得分:4)

最现实的方法是获取路线的终点。

控制器没有文档所暗示的必需结构。操作方法不需要在名称中以Action为后缀。以这种方式记录的原因是因为很多人在路由yml中使用catch all配置,需要后缀来猜测端点。

打印出路线时:

print_r($this->container->get('router')->getRouteCollection()->all());

您将看到针对每条路线使用的控制器方法。 这些路线在技术上并不属于任何捆绑,因为您可以在任何类别的任何方法中指定路线。

但是,您可以使用列表和一些字符串魔法来根据命名空间告诉捆绑包。

请记住,像_controller这样的web_profiler.controller.profiler:infoAction意味着该方法属于通过依赖注入实例化的服务。

答案 1 :(得分: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);