2011-12-08 4 views
2

のインスタンスの取得私はSilexでアプリケーションを作成していますし、何らかの形で私は、メソッドのパラメータにmethod_name(Application $application)を行うことができない場所でSilex\Applicationのインスタンスを取得することが可能である場合には不思議でしたか?は、サイレックスアプリケーション

たとえば、アクションではないコントローラにプライベートメソッドがあるとします。パラメータとしてApplication $applicationを入力すると、それを渡す必要があるというエラーがスローされます。

私はそうしなければ手動でそのメソッドを渡す必要はありません。

答えて

4

本当に2つの方法があります。

a)クラスのコンストラクタに引数としてSilex\Applicationを渡し、それをインスタンス変数として割り当てます。

b)手で引数としてSilex\Applicationをプライベートメソッドに渡します。

あなたのクラスに完全なアプリが必要ですか?依存性注入のポイントは、依存性注入コンテナであるSilex\Application extend \Pimpleをコンテナに注入するのではなく、依存関係を直接注入することです。

+0

まあ、変数は$ app ['twig']に格納されていますが、どうすればいいですか?私は、オブジェクトがDIを介してメソッドに渡されるべきか、それとも普通に渡されるべき通常のパラメータであるかをPimpleが知っているかどうかは分かりません。 – ryanzec

+1

パラメータをメソッド呼び出しに自動的に渡すことはできません。しかし、コントローラクラスをサービスとして定義し、そのクラスのコンストラクタにtwigを挿入することができます。 – igorw

+0

私はこれを試した:http://pastebin.com/LpuC0cYn:しかしそれは動作しません。 – ryanzec

2

あなたのコメントをSilex/

use \Silex\Application; 
use \Symfony\Component\HttpFoundation\Request; 

class myController { 
    private $a; 

    // Route defined as: 
    // $app->get('/foo', 'myController::showPage'); 
    public function showPage(Application $a) { 
    $this->a = $a; 
    return $this->doAwesome(); 
    } 

    private function doAwesome() { 
    $twig = $this->a['twig']; 
    return $twig->render('awesomePage.twig'); 
    } 
} 

ルートのエンドポイントですべての機能が、その後保存します:アプリケーションは、私は私のサイレックス・プロジェクトのための別の関数で、現在のアプリケーションになって解決してきた方法ですが小枝サービスで取得することですアプリケーションはそれをクラスプロパティとして渡し、他の関数は取得する必要があります。つまり、すべての関数で$this->a = $a;を実行することを覚えておく必要があります。 tはdoAwesome()の前にと呼んでいます)doAwesome()を使用していますが、それは私がそれに取り組むために出てきた最もクリーンな方法です。