2013-02-26 52 views
6

我開始用symfony 2進行開發,它使用了很多依賴注入。我想知道是否有任何方法可以讓netbeans根據字符串檢測對象的類型,並用它們的方法自動完成?例如,$this->container->get('doctrine')返回Doctrine\Bundle\DoctrineBundle\Registry實例。在容器中,鑰匙doctrine對應於Doctrine\Bundle\DoctrineBundle\Registry如何自動完成從Symfony 2 DI在netbeans中的方法

像這樣的東西,也可以用於zendframework 2。

我不想在控制器中創建新的方法,也不使用/ * @var $ var Symfony ... * /,我會自動檢測。

回答

4

據我所知,IDE沒有辦法檢測你的容器返回的對象的類型。我的解決方案是將這些調用包裝到私有getter函數中。恕我直言,這也改善了代碼的可讀性 - 尤其是,如果你每次上課不止一次這樣做。

/** 
* @return \Doctrine\Bundle\DoctrineBundle\Registry 
*/ 
private function getDoctrine() 
{ 
    return $this->container->get('doctrine'); 
} 
+0

是的,我知道這一點的解決方案,但它沒有什麼,我期待的。我在http://netbeans.org/bugzilla/show_bug.cgi?id=226725 – dextervip 2013-02-26 21:49:47

+1

上打開了一個問題,這也是我所做的+1,儘管一般來說'protected'應該比private更受歡迎,除非(理論上的)兒童班不應該使用吸氣劑有一個特定的原因。 – halfer 2013-02-27 12:05:34

0

IDE「PhpStorm」允許建議「使用」聲明。 這個IDE提供了Symfony2和Drupal的特定功能!

編輯由JetBrains公司:http://www.jetbrains.com/phpstorm/

不是免費的,但功率足夠充分,以減少時間DEVELOPPEMENT時間(時間就是金錢...)

享受:)

0

phpStorm:

$foobar= $this->get('foobar'); //returns mixed 
/* @var \MyNamespace\FooBar $foobar*/ 

$foobar= $this->get('foobar'); //returns mixed 
/* @var FooBar $foobar*/ 

您可以使用Eclipse PDT做到這一點:

$foobar= $this->get('foobar'); //returns mixed 
/* @var $foobar \MyNamespace\FooBar*/ 
0

(走動)當涉及到Symfony的服務:

而不是

$doctrine = $this->container->get('doctrine'); 

使用

$doctrine = $this->getDoctrine(); 

由於你可以看到,Symfony允許你訪問它的大部分服務s直接來自$this變量。 NetBeans將知道要使用的自動完成。

讓我們看看爲什麼這個工程(控制器類中)

enter image description here

這是可能的,因爲控制器類進口登記類USE語句,

use Doctrine\Bundle\DoctrineBundle\Registry; 

,然後在方法註釋註釋它聲明返回對象類型與

/* 
* @return Registry 
*/ 

如果您調用$ this-> container-> get('doctrine');直接然後自動完成將被省略,你將不得不使用下面的內容。

(回答)到目前爲止沒有魔法自動完成工作。使用Php Storm(它可以滿足你的要求)。對於那些選擇堅持使用NetBeans的人,您需要使用手動註釋,如下例所示:

我們可以將NetBeans指向它應該用於自動完成的類。

1)從項目目錄中搜索終端服務要導入:

PHP斌/控制檯調試:容器

如果你知道你在尋找什麼用這個代替:

php bin/console d:container | grep的學說

...

學說--------------------------------- ----------------------- 主義\包\ DoctrineBundle \註冊表

...

2)如果不是一個服務使用get_class() PHP構建函數來獲取對象的類名,它是它的特定變量。或者使用反射類。隨你便。

3)一旦你知道更好的可讀性類名聲明USE聲明

use Doctrine\Bundle\DoctrineBundle\Registry; 

4)現在文,我們知道什麼是在特定變量的對象實例的類名,我們準備通知NetBeans的約我們通過使用註釋註釋來了解它可以啓用自動完成功能。

/** 
    * @var $doctrine Registry 
    */ 
    $doctrine = $this->container->get('doctrine'); 

現在自動完成已啓用。鍵入

$doctrine->| 

然後按Ctrl +空格鍵。見下圖:

enter image description here