Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我可以为Symfony控制器分配模板目录吗?_Php_Templates_Symfony - Fatal编程技术网

Php 我可以为Symfony控制器分配模板目录吗?

Php 我可以为Symfony控制器分配模板目录吗?,php,templates,symfony,Php,Templates,Symfony,我将模板存储在app/resources/views下,在这个views目录下,我还有两层目录来组织模板 在我的大多数控制器中,所有操作都从同一子目录呈现模板,例如,MyController中的所有操作都使用app/resources/views/foo/bar中的模板: class MyController extends Controller { public function someAction() { // stuff return $

我将模板存储在
app/resources/views
下,在这个views目录下,我还有两层目录来组织模板

在我的大多数控制器中,所有操作都从同一子目录呈现模板,例如,
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')取而代之


但我认为可能已经有一种更干净的内置方式,我还没有在文档中找到,比如类上的注释之类的。有人知道更好的方法吗?

有一些注释,可以设置输出模板,您只需返回数据数组就可以填充该模板(可能是空数组)

要使用它:

<?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'];
    }
}

有一些注释将设置输出模板,您只需返回数据数组来填充该模板(可能是空数组)

要使用它:

<?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'];
    }
}
我想你可以用。这应该允许您对路径使用快捷方式

在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');
}
编辑

如果您真的希望避免重复每一个动作的路径,那么您可以考虑使用TigiguLoad Server文件系统作为参数创建控制器侦听器(KNEL.COVER事件)。 在这个监听器中,编写如下内容(我还没有测试过这段代码):

这允许您添加路径,而无需覆盖每个控制器的渲染方法

我想你可以用。这应该允许您对路径使用快捷方式

在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');
}
编辑

如果您真的希望避免重复每一个动作的路径,那么您可以考虑使用TigiguLoad Server文件系统作为参数创建控制器侦听器(KNEL.COVER事件)。 在这个监听器中,编写如下内容(我还没有测试过这段代码):


这允许您添加路径,而无需覆盖每个控制器的渲染方法

什么意思?为什么不使用这个-?对我来说,重点是避免重复输入相同的内容。我已经看到了您链接的部分,但是我的模板不是捆绑的。它们只是在默认的
app/resources/views
位置。@Don't我认为你的上一个解决方案已经相当干净了。这会让你的意图更加明确。@Pete谢谢!我同意,我只是不想重新发明轮子;如果这个框架已经提供了我想要做的事情,我宁愿使用它。@Don't。。那你在找什么?类似于
@TemplatePath
注释的东西,您可以用它来注释类?我不确定我是否更喜欢这样的注释而不是您已经使用的解决方案。但我有偏见——我讨厌PHP“注释”,因为它们感觉不自然。这有什么意义?为什么不使用这个-?对我来说,重点是避免重复输入相同的内容。我已经看到了您链接的部分,但是我的模板不是捆绑的。它们只是在默认的
app/resources/views
位置。@Don't我认为你的上一个解决方案已经相当干净了。这会让你的意图更加明确。@Pete谢谢!我同意,我只是不想重新发明轮子;如果这个框架已经提供了我想要做的事情,我宁愿使用它。@Don't。。那你在找什么?类似于
@TemplatePath
注释的东西,您可以用它来注释类?我不确定我是否更喜欢这样的注释而不是您已经使用的解决方案。但是我有偏见——我讨厌PHP“注释”,因为它们感觉不自然。谢谢你的回答!我确实知道特定操作的模板注释,但我正在尝试为类分配一个目录,该类定义了一个公共目录,用于各种操作的所有不同模板将位于该目录中。根据你的回答和其他评论,我想我需要编辑我的问题,以便更清楚地了解我想做什么。我编辑了这个问题。希望我能更好地描述我的目标。谢谢你的回答!我确实知道特定操作的模板注释,但我正在尝试为类分配一个目录,该类定义了一个公共目录,用于各种操作的所有不同模板将位于该目录中。根据你的回答和其他评论,我想我需要编辑我的问题,以便更清楚地了解我想做什么。我编辑了这个问题。希望我能更好地描述我的目标。这会有所帮助。事实上,这种重复困扰我的主要原因是我的实际路径实际上比
foo/bar
长了很多。但即使时间更短,我仍然需要在每个动作中重复,这是我试图避免的,理想情况下。这会有所帮助。事实上,这种重复困扰我的主要原因是我的实际路径实际上比
foo/bar
长了很多。但即使时间更短,我仍然需要在每一个动作中重复它,这是我试图避免的,理想情况下。