Я искал способ сделать это в течение нескольких месяцев. Я один из тех разработчиков, кто любит автозаполнение. Для каждого вызова сервисного локатора в Zend Framework 2 я набираю подсказку со следующим:
/** @var \Module\Service\SuperService $superService */
$superService => $this->getServiceLocator()>get('\Module\Service\SuperService');
$superService->coolFunction();
Это работает, но код может запутаться, когда вы начнете получать 2-4 Сервиса в одном контроллере. Я пытаюсь найти лучший способ использовать PHP Storm и подсказки типа для вызовов службы локатора
Хотя это не помогает вам сейчас, полезно знать, что мы готовы поддержать это из коробки, с некоторыми оговорками:
Контейнеру необходимо реализовать проект Контейнерного взаимодействия Container\Interop\ContainerInterface
который ServiceManager ZF2 уже делает.
Вам нужно использовать ::class
super-global-hyper-magic-contant для именования и извлечения ваших классов. В вашем случае просто замените строку в вашем get
позвонить с Module\Service\SuperService::class
(доступно из PHP 5.4 и выше).
Я ожидаю, что эта функциональность будет доступна в нашем следующем выпуске, PhpStorm 2016.2, выход которого запланирован на лето.
Gary
Около месяца назад PHP Storm выпустил новую функцию, которая позволяет использовать статический файл для подсказки типа. Я лично использую это только для поиска сервисов, но это может быть использовано для многих других вещей, за которыми PHP Storm не может следовать, потому что это не волшебство.
$superService = $this->getServiceLocator()->get('\Module\Service\SuperService');
$superService->coolFunction();
Это делает несколько вещей для нас как разработчиков:
в проект ROOT (то же место, что и composer.json), должен (создать, если нет) файл с именем .phpstorm.meta.php Этот файл содержит статическую подсказку и какой экземпляр они используют.
Чтобы добавить свой собственный, просто бросьте его в существующий файл
ПРЕДУПРЕЖДЕНИЕ — Если вы объявляете неправильный класс, вы в конечном итоге будете писать код неправильно, и запутаетесь … это случилось со мной кучей
Я включаю мой текущий Config, который является личным для моего проекта, но дает больше понимания того, что делать.
namespace PHPSTORM_META {
$STATIC_METHOD_TYPES = [
\Zend\ServiceManager\ServiceLocatorInterface::get('') => [
/**
* Common services
*/
'doctrine.entitymanager.orm_default' instanceof \Doctrine\ORM\EntityManager,
'Zend\Db\Adapter\Adapter' instanceof \Zend\Db\Adapter\AdapterServiceFactory,
/** Custom to Project */
'RiotAdapter' instanceof \GameService\Service\RiotAdapter,
'SmiteAdapter' instanceof \GameService\Service\SmiteAdapter,
'GameService' instanceof \GameService\Service\GameService,
],
];
}
Если вам нужна дополнительная информация по этому вопросу, вы можете посмотреть пост @ Storm от PHP Storm. Вот