几个月来,我一直在寻找实现这一目标的方法。我是那些喜欢自动完成的开发人员之一。对于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的汇合帖子
虽然这对您现在没有帮助,但您应该知道,我们即将开箱即用地支持这一点,但有几个附带条件:
-
容器需要实现container Interop项目的
Container'Interop'ContainerInterface
,ZF2的ServiceManager已经这样做了。 -
您需要使用
::class
超级全局超魔术控件来命名和检索您的类。在您的情况下,只需将get
调用中的字符串替换为Module'Service'SuperService::class
(可从PHP 5.4及更高版本获得)。
我预计这个功能将在我们的下一个版本PhpStorm 2016.2中提供,该版本将于今年夏天左右发布。
Gary