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

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

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

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

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

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

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

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

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

1

Решение

Загрузить все действия контроллера, которым был назначен маршрут в 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);
}
}
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector