【问题标题】:Symfony2 - A way to get all controllers of a bundle?Symfony2 - 一种获取捆绑包的所有控制器的方法?
【发布时间】:2013-12-16 12:09:47
【问题描述】:

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

谢谢

【问题讨论】:

标签: symfony controllers


【解决方案1】:

最现实的方法是获取路由的端点。

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

当你打印出路线时:

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

您将看到针对每个路由使用的控制器方法。 从技术上讲,这些路由不“属于”任何捆绑包,因为您可以将路由指向任何类的任何方法。

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

请记住,_controller 之类的 web_profiler.controller.profiler:infoAction 表示该方法属于通过依赖注入实例化的服务。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-26
      • 1970-01-01
      • 2014-10-30
      • 2023-03-31
      相关资源
      最近更新 更多