使用服务定位器为PHP Storm提供更快、更好、更高效的类型提示


Faster, better, and more efficient type hinting for PHP Storm with service locators

几个月来,我一直在寻找实现这一目标的方法。我是那些喜欢自动完成的开发人员之一。对于zend框架2中的每个Service Locator调用,我都会键入以下提示:

没有全局提示文件

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

这是可行的,但当您开始在单个控制器中获得2-4个服务时,代码可能会变得混乱。我正试图找到一种更好的方法来使用PHP Storm和类型提示来调用服务定位器

大约一个月前,PHP Storm发布了一项新功能,允许使用静态文件进行类型提示。我个人只将其用于服务定位器,但它可以用于PHP Storm无法遵循的许多其他事情,因为它不是魔法。

带有全局提示文件

$superService = $this->getServiceLocator()->get(''Module'Service'SuperService');
$superService->coolFunction();

这为我们作为开发人员做了一些事情:

  • 团队合作(其他人将能够同时查看所有服务模块)
  • 编码
  • 速度
  • 代码整洁度
  • 规范标准
  • 单击可更快地进入课堂

该怎么办

项目ROOT(与composer.json相同的位置)中,应该有一个名为.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的汇合帖子

虽然这对您现在没有帮助,但您应该知道,我们即将开箱即用地支持这一点,但有几个附带条件:

  1. 容器需要实现container Interop项目的Container'Interop'ContainerInterface,ZF2的ServiceManager已经这样做了。

  2. 您需要使用::class超级全局超魔术控件来命名和检索您的类。在您的情况下,只需将get调用中的字符串替换为Module'Service'SuperService::class(可从PHP 5.4及更高版本获得)。

我预计这个功能将在我们的下一个版本PhpStorm 2016.2中提供,该版本将于今年夏天左右发布。

Gary