2011-12-06 7 views
4

例えば、以下のコントローラ/アクションを取る:Symfony2コントローラとテンプレートの式をバンドルに対して相対的に書くことはできますか?

public function indexAction() 
{ 
    return $this->render('TestBundle:TestController:index.html.twig'); 
} 

こうして私はテンプレート式を書きたい(または何でもそれの名前です):

public function indexAction() 
{ 
    return $this->render('*:TestController:index.html.twig'); 
} 

だから、symfonyは私は知っているがこの非常にバンドル内のテンプレートを探しています。私が参照したいすべてのテンプレート/アクション/リポジトリのOwner + Bundle全体を書くことは非常に面倒です。ほとんどの場合、私は同じバンドルのアクションとテンプレートを参照しています。

注:

'::index.html.twig' 

しかし、それは私が必要なものではありません:私は、テンプレートはアプリレベルで置くことができ、このようreferncedことを知っています。

答えて

0

カスタムコードでも可能です。

基本的にコントローラのrender()メソッドをオーバーライドし、現在のバンドルの名前をフェッチするロジックを含める必要があります。

コントローラがSymfony\Bundle\FrameworkBundle\Controller\Controllerに拡張されているのではなく、カスタムコントローラを拡張して(Symfonyのコントローラを拡張しています)これにより、独自のメソッドを追加することにより、コントローラに便利な機能を追加することができます。

例: MyBundle\Controller\MyController\MyCustomBaseControllerは、Symfony\Bundle\FrameworkBundle\Controller\Controllerです。

だから、私のカスタムコントローラに私はこれらの2つの方法があります:

public function render($view, array $parameters = array(), Response $response = null) { 
    $currentBundle = $this->getCurrentBundle(); 
    $view = str_replace('*', $currentBundle, $view); 
    return parent::render($view, $parameters, $response); 
} 

public function getCurrentBundle() { 
    $controller = $this->getRequest()->attributes->get('_controller'); 
    $splitController = explode('\\', $controller); 
    return $splitController[1]; 
} 

render()を見てみましょう。現在のバンドル名を取り出し、それを使用して $view変数を作成します。次に、 parent::render()を呼び出すだけです。それは、render文でバンドル名を手動で定義したかのようです。

ここのコードは非常に簡単なので、コントローラー名の入力を避けるなど、他の操作を簡単に行うことができるはずです。

重要:あなたがそうでなければPHPはrender()ためのメソッドのシグネチャが一致しないことに文句を言うでしょう、あなたuse Symfony\Component\HttpFoundation\Response確認して、カスタムコントローラを使用しない場合。

+0

はい、私はこのようなことをしなければならないと思いました。解決策は良いですが、フレームワークがすべてのタイプの参照(ビューテンプレートだけでなく)のためにデフォルトでこのようなことをしたら本当にうれしいでしょう。バンドルは非常にきれいになります。 – Jens

+0

上記の 'getCurrentBundle()'メソッドを使用する他のメソッドを変更できない理由はありません:) 'getRepository()'というショートカットを使用しています。これは 'getCurrentBundle()'で簡単にきれいになります。 –

+0

symfonyを作った人にこれが組み込まれていれば確かにいいでしょう。 – Jens

関連する問題