在Zend Framework 2模块中,我使用了一个闭包作为工厂:
'controllers' => [
'factories' => [
'ZendSkeletonModule\Controller\Skeleton' => function(AbstractPluginManager $pm) {
return new Controller\SkeletonController($pm->getServiceLocator()->get('Doctrine\ORM\EntityManager'));
},
],
],
虽然这没有任何问题,但我的IDE(PHP Storm)在$pm->getServiceLocator()->get('Doctrine\ORM\EntityManager')
抱怨以下消息:
预期\ Doctrine \ ORM \ EntityManagerInterface,得到数组|对象 调用参数类型与声明的不兼容。
那是因为在控制器中,我使用Doctrine\ORM\EntityManagerInterface
作为类型提示,我明白了。
但为什么PHP Storm会抱怨,我在这里看不到任何错误?此外,代码工作正常,所以我有点困惑。我是否需要添加某种特殊评论或某些内容来帮助' IDE?
答案 0 :(得分:1)
将EntityManager分配给带有PhpStorm静态分析可以使用的注释的变量。 get
方法本身对它不透明:
use Doctrine\ORM\EntityManager;
// snip
'controllers' => [
'factories' => [
'ZendSkeletonModule\Controller\Skeleton' => function(AbstractPluginManager $pm) {
/** @var EntityManager $entityManager */
$entityManager = $pm->getServiceLocator()->get(EntityManager::class);
return new Controller\SkeletonController($entityManager);
},
],
],
另外一些建议:
使用具体的工厂类,而不是使用闭包。这是因为闭包不能被操作码缓存,如果它包含闭包,你的配置数组也不能被缓存。
一个小问题,但假设PHP 5.5+,请考虑使用\Doctrine\ORM\EntityManager::class
,就像我在上面的示例中所做的那样,而不是使用ServiceLocator上的get方法的字符串文字。