Доброго времени суток! У меня появилась небольшая проблема во время программирования контроллера в Zend Framework 2, моя среда разработки никак не хотела давать подсказок по любым объектам, связанным со встроенной ORM Doctrine.
Описание проблемы автодополнения
Я пользуюсь IDE под названием IntelliJ IDEA от прекрасной фирмы JetBrains с установленным плагином на PHP, который называется PhpStorm. Но поверьте мне, дело совсем не в ней, любая среда бы не смогла разресолвить методы встроенной в Zend Framework доктрины.
Но ближе к делу.
Idea любезно отвечает «No suggestions», мол «сори, не знаю такого», на просьбу показать методы объекта класса EntityManager, я даже сделал скриншот.
Танцы с бубном вокруг настроек «Include Path» не увенчались успехом, пришлось идти бороздить просторы англоязычного интернета. Решение нашлось не сразу.
Оно заключается в том, чтобы явно указать тип переменной, которая является объектом доктриновского EntityManagerа. Сделать это можно с помощью PHP аннотации @var. Пару слов о ней.
Аннотация @var в PHP
@var - это специальная аннотация phpDoc, которая служит для уточнения типа и описания любой переменной, очень рекомендуется ее использовать и грамотно документировать переменные. Особенно, если вы пишете библиотеку, которую будут использовать другие программисты, они обязательно скажут вам "спасибо".
Пример использования
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
class MyClass { /** * @var object Description of object */ protected $ob; /** * @var array Description of array */ public $mas; /** * @var \AnotherClass $instance The AnotherClass instance */ public $instance; } |
Примеры демонстрируют, как можно задокументировать тип переменной и поделиться ее базовым описанием. Это очень упрощает жизнь и разработчиком самой библиотеки.
Важное замечание! Синтаксис нужно соблюдать безукоризненно, начинаться аннотация должна с /** и заканчиваться */, при этом возможен вариант написания в одну строку.
1 |
/** @var string $str Description */ |
Решение проблемы автодополнения в PhpStorm
Как раз таким образом мы и поборем слепоту PhpStormа, а именно напрямую укажем ему тип переменной, в которой будет находиться объект класса EntityManager.
Например, в моем случае каждый контроллер наследуется от CustomController, который имеет protected поле $em, и метод getEntityManager. Это удобно, не нужно копировать код получения менеджера во все контроллеры. Для того, чтобы IDE понимал, какого типа $em и показывал подсказки по методам EntityManager, достаточно прописать такую аннотацию.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
class CustomController extends AbstractActionController { /** * @var \Doctrine\ORM\EntityManager $em */ protected $em; public function getEntityManager() { if ($this->em === null) { $this->em = $this->getServiceLocator()->get('doctrine.entitymanager.orm_default'); } return $this->em; } } |
Все получилось, PhpStorm перестал капризничать и подсказывает нам методы менеджера сущностей доктрины.
Заключение
Небольшая неприятность с автодополнением решена. А вообще phpDocumentator это классный проект, документировать программы круто, вот официальный сайт, там можно подробнее познакомиться с phpDoc. А у меня на сегодня все, спасибо за внимание!