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

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

几个月来我一直在寻找一种方法来做到这一点。我是那些喜欢自动完成的开发人员之一。对于 zend framework 2 中的每个服务定位器调用,我键入以下提示:

没有全局提示文件

/** @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();

这对我们开发人员有一些帮助:

  • 团队合作(其他人将能够同时看到来自所有人的所有服务 模块)
  • 编码
  • 速度
  • 代码整洁
  • 代码标准
  • 点击进入 class 更快

做什么

项目ROOT中(与composer.json相同的地方),应该(如果没有则创建)一个文件称为 。phpstorm.meta.php 此文件包含静态提示及其使用的实例。

要添加您自己的,只需将其放入现有文件即可

WARNING - 如果声明错误 class,您将最终编写错误的代码并感到困惑。 .. 我遇到过很多次


我包括了我当前的配置,它是我的项目的个人配置,但让我更了解该做什么。

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 here

的@a confluence post

虽然这对您现在没有帮助,但让您知道我们即将支持开箱即用,但有一些附带条件:

  1. 容器需要实现 ZF2 的 ServiceManager 已经实现的容器互操作项目的 Container\Interop\ContainerInterface

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

我期待在我们的下一个版本 PhpStorm 2016.2 中提供此功能,该版本将于夏季左右发布。

加里