Я искал способ сделать это в течение нескольких месяцев. Я один из тех разработчиков, которые любят автозаполнение. Для каждого вызова Service Locator в zend framework 2 я набираю подсказку со следующим:
/** @var \Module\Service\SuperService $superService */ $superService => $this->getServiceLocator()>get('\Module\Service\SuperService'); $superService->coolFunction();
Это работает, но код может стать беспорядочным, когда вы начинаете получать 2-4 Services в одном контроллере. Я пытаюсь найти лучший способ использовать PHP Storm и набирать намеки на вызовы локатора сервисов
Хотя это не поможет вам сейчас, вам полезно знать, что мы близки к поддержке этого из коробки, с несколькими оговорками:
Контейнеру необходимо реализовать Container\Interop\ContainerInterface
проекта Container\Interop\ContainerInterface
который уже делает ServiceManager ZF2.
Вам нужно использовать суперкомпьютер super-global-hyper-magic-cont ::class
чтобы назвать и получить ваши классы. В вашем случае просто замените строку в вызове 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 ), должен (create if not) быть файл с именем .phpstorm.meta.php Этот файл содержит статический намек и какой экземпляр они используют.
Чтобы добавить свой собственный, просто бросьте его в существующий файл
ПРЕДУПРЕЖДЕНИЕ. Если вы объявите неправильный класс, вы в конечном итоге напишите код неправильно и смутитесь … это случилось со мной
Я включаю мою текущую конфигурацию, которая является личной для моего проекта, но дает больше понимания того, что делать.
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, ], ]; }
Если вам нужна дополнительная информация об этом, вы можете посмотреть @ сообщение о слиянии с PHP Storm здесь