Symfony – аннотация никогда не была импортирована

Я использую инфраструктуру Symfony и имею намерение добавить механизм автоматической документации в RESTful api моего проекта.

После некоторых поисков я нашел apidoc engine ( http://apidocjs.com/ ). Он работает довольно просто: вам нужно добавить некоторые аннотации для каждого контроллера из вас RESTful api и документация будет сгенерирована.

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

/** * @Route("/api/dictionary_list/{userId}/{sessionKey}", name="api/dictionary_list") * @api {get} /api/dictionary_list/{userId}/{sessionKey} 01. Values list (ids) for all system dictionaries * @apiName Dictionary list * @apiGroup Dictionary * * @apiParam {Integer} userId User's ID received in authorization request * @apiParam {String} sessionKey Session key received in authorization request * * @apiSuccess {Integer} parcelStatuses The name of current dictionary * @apiSuccess {String} itemId Item id which used in requests * @apiSuccess {String} itemName Item name */ public function dictionaryListAction($userId=null, $sessionKey=null) { ... } 

Как вы можете видеть, аннотация для apidoc такая же, как аннотация для маршрутизации в Symfony.

Кстати, в производственной среде он отлично работает, но в среде разработки я получаю исключение, как

 [Semantical Error] The annotation "@apiName" in method AppBundle\Controller\Api\apiDictionaryController::dictionaryListAction() was never imported. 

Есть ли способ исправить эту проблему и сказать Symfony, что аннотация для apidoc должна игнорироваться?

Related of "Symfony – аннотация никогда не была импортирована"

Вы можете использовать аннотацию IgnoreAnnotation чтобы сообщить читателю-читателю Docrine пропустить эту аннотацию в вашем контроллере. Для этого просто добавьте аннотацию добавить @IgnoreAnnotation("Annotation") в комментарий класса класса класса.

В вашем случае:

 /** * @IgnoreAnnotation("apiName") * @IgnoreAnnotation("apiGroup") * @IgnoreAnnotation("apiParam") * @IgnoreAnnotation("apiSuccess") */ class ActionController extends Controller /** * @Route("/api/dictionary_list/{userId}/{sessionKey}", name="api/dictionary_list") * @api {get} /api/dictionary_list/{userId}/{sessionKey} 01. Values list (ids) for all system dictionaries * @apiName Dictionary list * @apiGroup Dictionary * * @apiParam {Integer} userId User's ID received in authorization request * @apiParam {String} sessionKey Session key received in authorization request * * @apiSuccess {Integer} parcelStatuses The name of current dictionary * @apiSuccess {String} itemId Item id which used in requests * @apiSuccess {String} itemName Item name */ public function dictionaryListAction($userId=null, $sessionKey=null) { ... } 

Вы могли бы также рассмотреть возможность открытия PR для проекта doctrine / annotations, чтобы включить эту аннотацию по умолчанию, пропущенную как эта .

Надеюсь, эта помощь.

Symfony использует пакет doctrine / annotations для анализа аннотаций. Когда он сталкивается с неизвестной аннотацией, которая не была включена в черный список, она выдает исключение.

Вы можете добавить в черный список дополнительные аннотации, см. Doctrine docs – Игнорирование отсутствующих исключений :

 use Doctrine\Common\Annotations\AnnotationReader; AnnotationReader::addGlobalIgnoredName('api'); AnnotationReader::addGlobalIgnoredName('apiParam'); AnnotationReader::addGlobalIgnoredName('apiGroup'); AnnotationReader::addGlobalIgnoredName('apiSuccess'); 

Я бы поставил это в app / autoload.php, поскольку это глобальная настройка.

Аннотации читаются во время компиляции DI Container, поэтому может быть лучше проигнорировать аннотации apidocs во время прохождения компилятора .

Пример:

 <?php namespace YourBundle\DependencyInjection; use Doctrine\Common\Annotations\AnnotationReader; use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; use Symfony\Component\DependencyInjection\ContainerBuilder; class IgnoreApiDocsAnnotationsPass implements CompilerPassInterface { public function process(ContainerBuilder $container) { AnnotationReader::addGlobalIgnoredName('api'); AnnotationReader::addGlobalIgnoredName('apiDefine'); AnnotationReader::addGlobalIgnoredName('apiDeprecated'); AnnotationReader::addGlobalIgnoredName('apiDescription'); AnnotationReader::addGlobalIgnoredName('apiError'); AnnotationReader::addGlobalIgnoredName('apiErrorExample'); AnnotationReader::addGlobalIgnoredName('apiExample'); AnnotationReader::addGlobalIgnoredName('apiGroup'); AnnotationReader::addGlobalIgnoredName('apiHeader'); AnnotationReader::addGlobalIgnoredName('apiHeaderExample'); AnnotationReader::addGlobalIgnoredName('apiIgnore'); AnnotationReader::addGlobalIgnoredName('apiName'); AnnotationReader::addGlobalIgnoredName('apiParam'); AnnotationReader::addGlobalIgnoredName('apiParamExample'); AnnotationReader::addGlobalIgnoredName('apiPermission'); AnnotationReader::addGlobalIgnoredName('apiPrivate'); AnnotationReader::addGlobalIgnoredName('apiSampleRequest'); AnnotationReader::addGlobalIgnoredName('apiSuccess'); AnnotationReader::addGlobalIgnoredName('apiSuccessExample'); AnnotationReader::addGlobalIgnoredName('apiUse'); AnnotationReader::addGlobalIgnoredName('apiVersion'); } } 

Я получил полный список аннотаций из документов apidoc . Вам необходимо зарегистрировать пропуск компилятора в своем комплекте

 <?php namespace YourBundle; use SuplaWebApiBundle\DependencyInjection\IgnoreApiDocsAnnotationsPass; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\HttpKernel\Bundle\Bundle; class SuplaWebApiBundle extends Bundle { public function build(ContainerBuilder $container) { parent::build($container); $container->addCompilerPass(new IgnoreApiDocsAnnotationsPass()); } } 

Вам необходимо импортировать Route:

используйте Sensio \ Bundle \ FrameworkExtraBundle \ Configuration \ Route;