2011-08-27 10 views
15

私はIDEとしてPHP Stormを使用していますが、Netbeansのような他のIDEには以下で説明するような問題があると思います。Symfony2依存性注入でオートコンプリート機能を維持する

Symfony2のようなフレームワークを使用している場合、私たちは素晴らしい依存性注入の世界を追加しました。だから、オブジェクトには、単純に次のコードのようなコードを使用してインスタンス化することができます。

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

オブジェクトがすでに事前に設定されているように、これは、非常に便利です。 1つの問題は、IDEがどのタイプのget()メソッドが返ってきているのかわからないため、基本的にどのPHP IDEでも自動補完が完全に中断することです。

自動補完を保存する方法はありますか?たとえばコントローラの拡張を作成するのが答えでしょうか?たとえば、次のように

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

し、アプリケーションコントローラの代わりに、コントローラの基本クラスとしてMyControllerを指定しますか?

Factoryクラスまたはその他の可能なメソッドの使用についてはどうですか?

+0

オブジェクトがオブジェクトであるか、特定のクラスのオブジェクトであるかわからないという問題はありますか?それが前者なら、$ myThingyをオブジェクトとしてキャストできませんか? – DaveRandom

+0

真実ですが、オブジェクトにキャストしても、クラスのインスタンスの型が意味するところは無限に残ります。つまり、まだ自動ではありません。 - 悲しげに完成。 : –

+0

私と同じもの:http://stackoverflow.com/questions/21936380/best-practise-including-code-completion-in-zf2、同じソリューションだが、すべて余分な作業が必要。 – Gizzmo

答えて

15

それはより多くの関与ですが、あなたはまだ日食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キーを押しながら注釈をクリックしてコレントファイルを開くことができますが、実際にはうまくいきたいと思っています。 – 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うん、単純にゲッターを使用し、コントローラーのために私のタイプのヒントを行うための最良の方法を見つけました。 – gilden

1

私はKomodo Studioを使用し、@varで変数をタグ付けすると、メソッド内でも自動補完が維持されます。私はバンドルの基本Controllerクラスを使用するのNetBeans IDE 7.1.2 PHPで

0

。メソッドでreturnを注釈する必要があります。少なくともEclipse上で動作します。

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

私は/ * var ... * /が好きではありません。 サービスが既に読み込まれていると誤って判断する可能性があるため、プライベートプロパティが嫌いです。

+0

はいこれは次のように動作します:/ * @var $ em \ Doctrine \ ORM \ EntityManager */ – ivoba

6

作業

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

この回答に同意すると、クラスに1より大きい依存関係が必要な場合に最もクリーンな解決策であることがわかりました時間。 – Inoryy