来自基本控制器symfony2的全局变量

时间:2014-05-02 06:32:30

标签: php symfony twig

我试图拦截渲染功能或响应 在加载视图(twig)之前向其添加变量。

我试图覆盖默认的渲染方法但是它 仍然给了我

  

变量" myvar"在第10行的/path/to/baseAppLite.html.twig中不存在

我的代码有什么问题,还有更好的方法吗?

这是我在 baseController

中的覆盖代码
public function render($view, array $parameters = array(), Response $response = null)
{
    $parameters = array_merge(
        $parameters,
        array(
            'myvar' => 'GlobalVar'
        )
    );
    return parent::render($view, $parameters, $response);
}

用法

{{ myvar }}

更新: 从我可以看到的是渲染功能没有加载 因为我试着回应"渲染吧foo"并没有出现

2 个答案:

答案 0 :(得分:3)

我认为渲染功能根本不需要被覆盖。 我可以想到几种方法可以访问某种全局变量,具体取决于全局变量的设置(或计算)方式。

Twig Globals

如果它是一个硬编码变量,那么你可以将它作为一个twig全局变量添加到你的config.yml中,就像这样......

# app/config/config.yml
twig:
    # ...
    globals:
        ga_tracking: UA-xxxxx-x

然后可以像...一样使用

<p>The google tracking code is: {{ ga_tracking }}</p>

如此处所述 - http://symfony.com/doc/current/cookbook/templating/global_variables.html

树枝功能

或者,如果变量以某种方式与外部服务相关,则可以使用自定义树枝函数并在模板中调用它。

枝条延伸(带功能)..

class AcmeExtension extends \Twig_Extension
{
    protected $container;

    public function __construct(ContainerInterface $container = null)
    {
        $this->container = $container;
    }

    public function getFunctions()
    {
        return array(
            new \Twig_SimpleFilter(
                'get_parameter', 
                array($this, 'getParameter')
            ),
        );
    }

    public function getParameter($parameter)
    {
        if (null === $this->container) {
            return null;
        }

        return $this->container->getParameter($parameter);
        // You could also do perform some kind of action 
        // rather than just return a value
    }

    public function getName()
    {
        return 'acme_extension';
    }
}

注册为服务..

services:
    acme.twig.acme_extension:
        class: Acme\DemoBundle\Twig\AcmeExtension
        arguments:
            - @service_container
        tags:
            - { name: twig.extension }

然后在你的模板中你可以使用..

{{ get_parameter('myVar') }}

甚至......

{% set myVar = get_parameter('myVar') %}

答案 1 :(得分:1)

要添加到我的评论中,我已经创建了这个答案(抱歉语法错误/拼写错误)。

如果您想在需要始终存在的模板中传递var,您可以执行以下操作(无论如何我都是这样做的。)

我们假设我们有一个带有CRUD方法的PageController(更新,删除,显示等)。我们不是每次都传递那个var(或者通过修改已经定义的方法),而是可以执行以下操作:让Twig“获取”&#39; var通过呈现控制器动作。 Twig将调用相应的控制器并将呈现该变量。让我们假装它是一个页脚中的句子,需要在每个页面上按变量呈现(为了保持简单)。

我们可以在PageController中编写以下操作:

public function renderFooterAction() {

    //Do your logic here, like retrieving the var from the database
    //or something completely different.
    //It could also be as easy as this:
    $myVar = "This is a footer sentence";

    //At the end we return a template
    return $this->render('AcmeDemoBundle:Page:footer.html.twig', array(
        'myVar' => $myVar,
    ));
}

footer.html.twig页面位于YourBundle \ Resources \ views \ Page \ footer.html.twig中。根据您的需要,它可能就像这样(您可以像常规树枝模板一样在这里做所有事情,我们保持简单并且只回显变量):

{{ myVar }}

在主模板中,您可以使用以下代码:     {{render(&#39; AcmeDemoBundle:Page:renderFooter&#39;))}}

如果您需要在渲染其中一部分时,也可以在模板中传递参数,例如:

{{ render(controller('AcmeDemoBundle:Page:footer', { 'maxArticles': 5 })) }}

上面的假设是你想在控制器呈现的模板中进行for循环。

正如您所看到的,在模板中渲染控制器几乎就像渲染一个正常的&#39;查看,而不是返回整个模板,只需创建只有控制器负责输出的较小文件。

希望这个解释对你有所帮助:)当然,如果你仍然感到困惑,那就要求更清晰了。

编辑:也应该可以直接返回变量(我认为),但不能那么快记住。如果我能找到它会添加:)