使用服务定位器为 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
虽然这对您现在没有帮助,但让您知道我们即将支持开箱即用,但有一些附带条件:
容器需要实现 ZF2 的 ServiceManager 已经实现的容器互操作项目的 Container\Interop\ContainerInterface
。
您需要使用 ::class
超级全局超级魔法常数来命名和检索您的 类。在您的情况下,只需将 get
调用中的字符串替换为 Module\Service\SuperService::class
(可从 PHP 5.4 及更高版本获得)。
我期待在我们的下一个版本 PhpStorm 2016.2 中提供此功能,该版本将于夏季左右发布。
加里
几个月来我一直在寻找一种方法来做到这一点。我是那些喜欢自动完成的开发人员之一。对于 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虽然这对您现在没有帮助,但让您知道我们即将支持开箱即用,但有一些附带条件:
容器需要实现 ZF2 的 ServiceManager 已经实现的容器互操作项目的
Container\Interop\ContainerInterface
。您需要使用
::class
超级全局超级魔法常数来命名和检索您的 类。在您的情况下,只需将get
调用中的字符串替换为Module\Service\SuperService::class
(可从 PHP 5.4 及更高版本获得)。
我期待在我们的下一个版本 PhpStorm 2016.2 中提供此功能,该版本将于夏季左右发布。
加里