Php 使用Symfony2依赖项注入保留自动完成功能

Php 使用Symfony2依赖项注入保留自动完成功能,php,symfony,phpstorm,Php,Symfony,Phpstorm,我使用PHPStorm作为我的IDE,但我相信其他IDE(如Netbeans)也会遇到与我将在下面解释的相同的问题 当使用像Symfony2这样的框架时,我们加入了依赖注入的奇妙世界。因此,可以使用如下代码片段简单地实例化对象: $myThingy = $this->get('some_cool_service'); 这非常方便,因为对象已经预先配置好了。一个问题是,自动完成基本上在任何PHP IDE中都会完全中断,因为IDE不知道get()方法返回的是什么类型 有没有办法保持自动完成?

我使用PHPStorm作为我的IDE,但我相信其他IDE(如Netbeans)也会遇到与我将在下面解释的相同的问题

当使用像Symfony2这样的框架时,我们加入了依赖注入的奇妙世界。因此,可以使用如下代码片段简单地实例化对象:

$myThingy = $this->get('some_cool_service');
这非常方便,因为对象已经预先配置好了。一个问题是,自动完成基本上在任何PHP IDE中都会完全中断,因为IDE不知道get()方法返回的是什么类型

有没有办法保持自动完成?例如,创建控制器的扩展就是答案吗?例如:

class MyController extends Controller {
    /**
     * @return \MyNamespace\CoolService
     */
    public getSomeCoolService() {
        return new CoolService();
    }
}
然后对于应用程序控制器,指定MyController作为基类而不是控制器


使用Factory类或任何其他可能的方法怎么样?

它更复杂,但您仍然可以使用eclipse PDT来实现这一点:

$myThingy = $this->get('some_cool_service');
/* @var $myThingy \MyNamespace\CoolService */
更新: 上的示例显示,您也可以使用phpStorm的另一种方法:

$myThingy = $this->get('some_cool_service');
/* @var \MyNamespace\CoolService $myThingy */

您可以在控制器中定义私有属性

class MyController extends Controller
{
    /**
     * @var \Namespace\To\SomeCoolService;
     */
    private $my_service;

    public function myAction()
    {
        $this->my_service = $this->get('some_cool_service');
        /**
         * enjoy your autocompletion :)
         */
    }
}

我使用Komodo Studio,并且使用@var标记变量,甚至在方法内部,为我保留自动完成

namespace MyProject\MyBundle\Controller;

use Symfony\Component\DependencyInjection\ContainerAware;
use Symfony\Component\HttpFoundation\Request;

class WelcomeController extends ContainerAware
{
    public function indexAction()
    {
        /*@var Request*/$request = $this->container->get('request');
        $request->[autocomplete hint list appears here]
    }
}

使用netbeans IDE 7.1.2 PHP时,我对bundle使用基本控制器类。您需要对returnin方法进行注释。至少在Eclipse上是这样

/**
 * Gets SomeCoolService
 *
 * @return \Namespace\To\SomeCoolService
 */
protected function getSomeCoolService()
{
    return $this->get('some_cool_service');
}
我不喜欢/*var…*/,,因为代码太多了。
我不喜欢私有属性,因为您可能会错误地认为服务已经加载。

问题是它不知道它是一个对象,还是它不知道它是一个特定类的对象?如果是前者,你不能将$myThingy作为一个对象吗<代码>$myThingy=(对象)$this->get('some_cool_service')True,但即使对对象进行强制转换,IDE仍然无法知道实例类类型是什么,这意味着…仍然没有自动完成(和我有一样的东西:,同样的解决方案,但都需要额外的工作。@gilden:我习惯在没有名称空间的情况下做这件事,我不是100%确定它是否有效,但如果肯定有效的话。只是再试一次,是的……对我来说不起作用。我可以按住Ctrl键并单击注释打开相应的文件。我真的希望它能起作用。看起来它是一个倒转对于phpstorm:只有在类作用域中定义变量时,这才有效,但在方法中是无用的。等等,这对phpstorm有效,但实际上:/*@var\MyNamespace\CoolService$myThingy*/这似乎是一个开始,是的。这样你就无法在代码中知道
$This->my_service
是否已经启动。我会使用这种方法只适用于构造函数注入。@barius是的,我发现最好的方法就是简单地使用getter并在那里为控制器进行类型暗示。同意这个答案,我发现它是最干净的解决方案,适用于需要在类中依赖项超过1次的情况。是的,它的工作原理如下:/*@var$em\doctor\ORM\EntityMan阿格*/