2017-03-07 46 views
0

我存储在app/resources/viewsin accordance with the Symfony documentation下的模板,并在该视图目录下,我有几层目录来保持我的模板组织。我可以将模板目录分配给Symfony控制器吗?

在我的大多数控制器,所有动作渲染模板从相同的子目录,例如,所有在MyController使用的模板的行动中app/resources/views/foo/bar

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

有什么意义?为什么不使用这个 - [在Bundle语法中引用模板](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。这应该允许你为你的路径使用快捷方式。

在你config.yml,设置命名空间树枝路径那样:

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

而在你的控制器:

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

编辑

如果你真的想避免为每个动作重复路径,那么你可以考虑用Twig_Loader_Fil创建一个控制器监听器(在kernel.controller事件上)系统作为参数。

在这个监听器,写这样的事情(我没有测试此代码):

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); 
     } 
    } 
} 

这允许您添加路径没有覆盖的渲染方法,每个控制器。

+0

这会有所帮助。事实上,重复打扰我的主要原因是我的真实路径实际上比'foo/bar'长很多。但即使它更短,我仍然需要重复它的每一个行动,这是我想要避免,理想情况下。 –

相关问题