2017-03-07 10 views
0

私はテンプレートをapp/resources/viewsin accordance with the Symfony documentationの下に保存しています。そのビューディレクトリの下に、テンプレートを整理しておくためのディレクトリが2層以上あります。私のコントローラのほとんどでテンプレートディレクトリをSymfonyコントローラに割り当てることはできますか?

、すべてのアクションが同じサブディレクトリからテンプレートをレンダリングし、例えば、app/resources/views/foo/barMyController使用テンプレート内のすべてのアクション:

class MyController extends Controller 
{ 

    public function someAction() 
    { 
     // stuff 
     return $this->render('foo/bar/some.html.twig'); 
    } 

    public function otherAction($id) 
    { 
     // more stuff 
     return $this->render('foo/bar/other.html.twig'); // same dir, different template 
    } 
} 

は「symfonyの」方法はあります特定のfoo/barディレクトリをコントローラーに一度だけ割り当ててください。これを繰り返す必要はありませんか?

私は現在、保護されたプロパティにディレクトリを割り当て、親がこのようなテンプレート名にそれを追加する方法をレンダリングラップすることにより、それをやっている:

protected $view_path = 'foo/bar/'; 

protected function render($view, array $parameters = array(), Response $response = null) { 
    return parent::render($this->view_path . $view, $parameters, $response); 
} 

それでは、私はちょうど代わりreturn $this->render('some.html.twig');を書くことができます。

しかし、クラスやその他のアノテーションのように、ドキュメントにまだ見つからなかったクリーナービルトインの方法があると思います。誰かがより良い方法を知っていますか?

+0

何がポイントですか?なぜこれを使用しないのですか?[バンドル構文のテンプレートの参照](http://symfony.com/doc/current/templating.html#referencing-templates-in-a-bundle)? –

+0

私には同じことを何度も繰り返さないようにすることがポイントです。そして私はあなたがリンクしている部分を見ましたが、私のテンプレートはバンドルに含まれていません。それらはデフォルトの 'app/resources/views'の場所にあります。 –

+0

@ Don'tPanic私はあなたの最後の解決策はすでにかなりきれいだと思います。あなたの意図を明白にします。 – Pete

答えて

1

出力テンプレートを設定する注釈があります。このテンプレートでは、データの配列を返すだけで、そのテンプレート(空の配列でも可)を埋め込むことができます。

はそれを使用するには、次の

<?php 
namespace AppBundle\Controller; 

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 

class AboutController extends Controller 
{ 
    /** 
    * @Template("About/index.html.twig") 
    * use the template from /app/Resources/views/About/index.html.twig 
    */ 
    public function indexAction(Request $request) 
    { 
     return ['key' => 'data']; 
    } 
} 

テンプレートに置かれて任意のカスタムデータがない場合は、あなたもそれを行うことができ、完全にルート内:

app_about_hello: # just show the template for the URL path 
    path: /about/hello 
    defaults: 
     _controller: FrameworkBundle:Template:template 
     template: ':About:hello.html.twig' 
+0

答えをありがとう!特定のアクションのテンプレート注釈についてはわかりますが、さまざまなアクションのテンプレートがすべて配置される共通のディレクトリを定義するクラスにディレクトリを割り当てようとしています。あなたの答えと他のコメントに基づいて、自分がしようとしていることをより明確にするために私の質問を編集する必要があると思います。 –

+0

私は質問を編集しました。うまくいけば、自分の目標をもう少し詳しく説明することができたらと思っています。 –

3

を私はあなたを考えますNamespaced Twig Pathsを使用できます。これにより、パスにショートカットを使用できるようになります。

twig: 
    paths: 
     '%kernel.root_dir%/../app/resources/views/my/very/long/path/foo/bar/': foobar 

そして、あなたのコントローラで:そのようなあなたのconfig.yml、セット名前空間小枝パスで

public function someAction() 
{ 
    // stuff 
    return $this->render('@foobar/some.html.twig'); 
} 

EDIT

あなたが本当にしないようにするにはあなたはおそらく、Twig_Loader_Filを使ってコントローラリスナー(kernel.controllerイベント上)を作成することを検討することができますesystemをパラメータとして使用します。

class pathListener 
{ 
    private $loader; 

    function __construct(\Twig_Loader_Filesystem $loader) 
    { 
     $this->loader = $loader; 
    } 

    public function onKernelController(FilterControllerEvent $event) 
    { 
     $controller = $event->getController()[0]; 

     if (isset($controller->view_path)) { 
      $this->loader->addPath($controller->view_path); 
     } 
    } 
} 

これは、あなたが各コントローラにrenderメソッドをオーバーライドすることなく、パスを追加することができます。このリスナーで

は、このような何か(私はこのコードをテストしていない)を書き込みます。

+0

これはやや役立ちます。実際、繰り返しが私に迷惑をかけていた主な理由は、私の実際の道は 'foo/bar'よりかなり長いということです。しかし、それがもっと短かったとしても、私はそれを繰り返す必要があります。これは理想的には私が避けようとしていることです。 –

関連する問題