检索具有特定注释的所有控制器操作 - Symfony2

时间:2014-12-28 11:08:07

标签: symfony annotations command

我创建了一个名为@Module的注释类和一个命令GenerateModulesCommand。我想要的是找到所有具有@Module注释的控制器动作。

示例:

/**
 * 
 * @Module(name='sidebar', enabled=true')
 */
public function sidebarAction($name) {
    $ape = new ArrayParamsExtension ();
    return $this->render('ModuleManagerBundle:Default:sidebar.html.twig', $ape->getArrayParams($name));
}

我希望能够查看@Module中的特定属性(名称,启用等...) 到目前为止,这是我的命令执行方法:

protected function execute(InputInterface $input, OutputInterface $output) {
    $path = $this->getApplication()->getKernel()->locateResource('@ModuleManagerBundle');
    $driver = new PHPDriver($path);
    $classes = $driver->getAllClassNames();

    foreach ($classes as $key => $class) {
        $reader = new AnnotationReader();

        $annotationReader = new CachedReader(
                $reader, new ArrayCache()
        );

        $reflClass = new ReflectionClass("\Controller\\" . $reportableClass);
        $annotation = $annotationReader->getClassAnnotation(
                $reflClass, 'Custom_Annotation'
        );
        if (is_null($annotation)) {
            unset($classes[$key]);
        }
    }


    $output->writeln($path);
}

我在沙发上发现了这段代码,但我不知道如何搜索所有Controller类及其中的所有动作。

1 个答案:

答案 0 :(得分:1)

您可以在函数

中尝试此操作
use Doctrine\Common\Annotations\AnnotationReader;

你的功能

    public function getControllersWithAnnotationModules()
        {
            $allAnnotations = new AnnotationReader();
            $controllers = array();
            foreach ($this->container->get('router')->getRouteCollection()->all() as $route) {
                $defaults = $route->getDefaults();
                if (isset($defaults['_controller'])) {
                    $controllerAction = explode(':', $defaults['_controller']);
                    $controller = $controllerAction[0];
                    if (!isset($controllers[$controller]) && class_exists($controller)) {
                        $controllers[$controller] = $controller;
                    }


                }
            }
            $controllersWithModules = array();
            foreach($controllers as $controller){

                $reflectionClass = new \ReflectionClass($controller);
                $module = $allAnnotations->getClassAnnotation($reflectionClass,'Acme\YourBundle\Module');
                if($module)
                    $controllersWithModules[] = $controller;

            }
            return $controllersWithModules ;

        }