Zend Framework2 — быстрее, лучше и эффективнее подсказки типов для PHP Storm с помощью сервисов-локаторов

Я искал способ сделать это в течение нескольких месяцев. Я один из тех разработчиков, кто любит автозаполнение. Для каждого вызова сервисного локатора в Zend Framework 2 я набираю подсказку со следующим:

Без глобального файла хинтинга

/** @var \Module\Service\SuperService $superService */
$superService => $this->getServiceLocator()>get('\Module\Service\SuperService');
$superService->coolFunction();

Это работает, но код может запутаться, когда вы начнете получать 2-4 Сервиса в одном контроллере. Я пытаюсь найти лучший способ использовать PHP Storm и подсказки типа для вызовов службы локатора

3

Решение

Хотя это не помогает вам сейчас, полезно знать, что мы готовы поддержать это из коробки, с некоторыми оговорками:

  1. Контейнеру необходимо реализовать проект Контейнерного взаимодействия Container\Interop\ContainerInterface который ServiceManager ZF2 уже делает.

  2. Вам нужно использовать ::class super-global-hyper-magic-contant для именования и извлечения ваших классов. В вашем случае просто замените строку в вашем get позвонить с Module\Service\SuperService::class (доступно из PHP 5.4 и выше).

Я ожидаю, что эта функциональность будет доступна в нашем следующем выпуске, PhpStorm 2016.2, выход которого запланирован на лето.

Gary

1

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

Около месяца назад 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. Вот

4

По вопросам рекламы [email protected]