2011-08-27 60 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