Чтение пользовательских аннотаций контроллеров из пользовательской команды в Symfony 2

1

Я создал пользовательские аннотации для создания JSON файлов (для NodeRed, если вы спросите...), и я успешно их тестирую из фиктивного метода в фиктивном контроллере.

Я хотел бы передать все это в пользовательскую команду Sf, чья работа состояла бы в том, чтобы прочитать все аннотации контроллеров в моем пакете и добиться того же результата (также создайте файлы JSON).

Как я могу это достичь? Будет ли цикл с помощью файла XxxxController.php с помощью finder хорошим вариантом? Или слишком амбициозным? :п

Пример аннотации:

/**
 * @NodeRedFlows(
 *     triggerBy="testFlow", options={"interval":"45"}  
 * )
 */
 public function indexAction() { /*...*/ }

Извините, не так просто опубликовать еще один код, потому что у меня есть весь класс читателей, класс аннотации и другой класс, создающий потоки JSON на основе triggerBy="testFlow".

Нижняя линия:*

Я хотел бы иметь возможность создать файл потока JSON из Command вместо этого в моем контроллере (используется для тестов).

Теги:
annotations

1 ответ

2
Лучший ответ

Загрузите все действия контроллера, которым был назначен маршрут в Symfony (см. Это и это).

Затем загрузите аннотации для каждого найденного действия контроллера:

use Doctrine\Common\Annotations\AnnotationReader;
use Symfony\Component\HttpFoundation\Request;

$annotationReader = new AnnotationReader();
$routes = $this->container->get('router')->getRouteCollection()->all();
$this->container->set('request', new Request(), 'request');

foreach ($routes as $route => $param) {
    $defaults = $params->getDefaults();

    if (isset($defaults['_controller'])) {
         list($controllerService, $controllerMethod) = explode(':', $defaults['_controller']);
         $controllerObject = $this->container->get($controllerService);
         $reflectedMethod = new \ReflectionMethod($controllerObject, $controllerMethod);

         // the annotations
         $annotations = $annotationReader->getMethodAnnotations($reflectedMethod );
    }
}

ОБНОВИТЬ:

Если вам нужны все методы контроллера, в том числе без аннотации @Route, я бы сделал то, что вы предлагаете в своем вопросе:

// Load all registered bundles
$bundles = $this->container->getParameter('kernel.bundles');

foreach ($bundles as $name => $class) {
    // Check these are really your bundles, not the vendor bundles
    $bundlePrefix = 'MyBundle';
    if (substr($name, 0, strlen($bundlePrefix)) != $bundlePrefix) continue;

    $namespaceParts = explode('\\', $class);
    // remove class name
    array_pop($namespaceParts);
    $bundleNamespace = implode('\\', $namespaceParts);
    $rootPath = $this->container->get('kernel')->getRootDir().'/../src/';
    $controllerDir = $rootPath.$bundleNamespace.'/Controller';

    $files = scandir($controllerDir);
    foreach ($files as $file) {
        list($filename, $ext) = explode('.', $file);
        if ($ext != 'php') continue;

        $class = $bundleNamespace.'\\Controller\\'.$filename;
        $reflectedClass = new \ReflectionClass($class);

        foreach ($reflectedClass->getMethods() as $reflectedMethod) {
            // the annotations
            $annotations = $annotationReader->getMethodAnnotations($reflectedMethod);
        }
    }
}
  • 0
    Спасибо, но комментарий не всегда имеет аннотацию @Route ... Кроме того, строка "$ controllerObject = $ container-> get ($ controllerService);" выдает ошибку: «Вы не можете создать службу (« запрос ») неактивной области (« запрос »).». Кажется, это идет в правильном направлении мысли.
  • 0
    Я обновил ответ по адресу You cannot create a service ("request") of an inactive scope ("request") . ошибка
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню