2011-08-27 47 views
15

我使用PHP Storm作为我的IDE,但我相信其他IDE如NetBeans将具有相同的问题,我将在下面进行解释。使用Symfony2依赖注入保留自动完成功能

当使用像Symfony2这样的框架时,我们添加了依赖注入的美妙世界。所以,对象可以简单地使用类似下面的代码片段进行实例化:

$myThingy = $this->get('some_cool_service'); 

这是非常方便的,因为对象是已经预先配置。一个问题是,自动完成在基本上任何PHP IDE中完全中断,因为IDE不知道get()方法返回的是什么类型。

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

class MyController extends Controller { 
    /** 
    * @return \MyNamespace\CoolService 
    */ 
    public getSomeCoolService() { 
     return new CoolService(); 
    } 
} 

然后对于应用程序控制器,指定MyController作为基类而不是Controller?

如何使用Factory类或其他可能的方法?

+0

问题是它不知道它是一个对象,或者它不知道它是一个特定类的对象?如果它是前者,你不能只把$ myThingy作为一个对象吗? '$ myThingy =(object)$ this-> get('some_cool_service');' – DaveRandom

+0

确实如此,但即使转换为对象仍然会让IDE无法确定实例类的类型,这意味着......仍然没有自动可悲地完成。 :( –

+0

相同的东西,因为我有:http://stackoverflow.com/questions/21936380/best-practise-including-code-completion-in-zf2,同样的解决方案,但都需要额外的工作。 – Gizzmo

回答

15

更涉及,但你仍然可以做到这一点与Eclipse PDT:

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

UPDATE: 上this page的例子显示,你也可以轮phpStorm用另一种方式:

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

这从来没有在我的Eclipse – gilden

+0

@gilden:我习惯于这样做,没有命名空间,我不是100%肯定它的工作原理,但如果肯定应该。 – greg0ire

+0

只是试了一遍,是的...不适用于我。我可以Ctrl +点击注释打开corrent文件,但我真的希望它能起作用 – gilden

7

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

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 :) 
     */ 
    } 
} 
+0

这似乎是一个开始,是的。 –

+0

这样你就不能在代码中知道'$ this-> my_service'是否已经启动。我只能在构造函数注入时使用这种方法。 –

+0

@barius是的,我找到了最好的方法来简单地使用getters,并为控制器做我的类型暗示。 – gilden

1

我使用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] 
    } 
} 
0

使用NetBeans IDE 7.1.2 PHP

+0

是它的工作原理是这样的:/ * @var $ EM \原则\ ORM \ EntityManager的*/ – ivoba

6

我用控制器基类束。你需要在方法中注释返回。至少可以在Eclipse上使用。

/** 
* Gets SomeCoolService 
* 
* @return \Namespace\To\SomeCoolService 
*/ 
protected function getSomeCoolService() 
{ 
    return $this->get('some_cool_service'); 
} 

我不喜欢/ * var ... * /,因为它代码太多了。 我不喜欢私人财产,因为你可能错误地认为服务已经加载。

+0

议定了这个答案,我发现它是在你需要在类的依赖情况下,干净的解决方案超过1时间。 – Inoryy