(Twig)动态生成的参数

时间:2014-10-14 17:53:44

标签: php symfony

为所有Twig模板设置全局静态参数很容易,例如:How to get config parameters in Symfony2 Twig Templates

但是说,我希望在页面上的任何地方显示今年(例如,在版权的页脚中) - 这可以通过例如在PHP中:

date("Y")

现在,如何让它可用于所有树枝模板,而无需在每个控制器中传递它?

1 个答案:

答案 0 :(得分:3)

您应该创建一个Twig extension。在该链接中,您可以看到如何创建一个并在Symfony中注册它。它没有向您展示如何通过它定义全局,但过程非常简单并且described here

咀嚼

基本上,您只需要创建一个扩展\Twig_Extension的类。然后覆盖基本扩展类中的默认getGlobals方法,并通过它提供全局变量:

<?php

namespace MyBundle\Twig;

class MyTwigExtension extends \Twig_Extension
{
    public function getGlobals()
    {
        return [
            'current_year' => (new \DateTime())->format('Y'),
        ];
    }    
}

之后,只需将其注册为services.yml或您正在使用的任何格式:

services:
    mybundle.twig.my_twig_extension:
        class: MyBundle\Twig\MyTwigExtension
        tags:
            - { name: twig.extension }

根据评论更新

如果你需要在代码的其他部分访问该值,可能会有点棘手,并且有几种方法可以解决这个问题。

我的建议是,您创建的服务将为您提供所需的值:

<?php

namespace MyBundle\Util;

class CurrentYearProvider
{
    public function getCurrentYear()
    {
        return (new \DateTime())->format('Y');
    }
}

并将其注册为服务当然:

services:

    current_year_provider:
        class: MyBundle\Util\CurrentYearProvider

之后你应该用枝条扩展注入它:

services:
    mybundle.twig.my_twig_extension:
        class: MyBundle\Twig\MyTwigExtension
        arguments: [@current_year_provider]
        tags:
            - { name: twig.extension }

并使用它来获取值:

<?php

namespace MyBundle\Twig;

class MyTwigExtension extends \Twig_Extension
{
    private $yearProvider;

    public function __construct(CurrentYearProvider $yearProvider)
    {
        $this->yearProvider = $yearProvider;
    }

    public function getGlobals()
    {
        return [
            'current_year' => $this->yearProvider->getCurrentYear(),
        ];
    }    
}

如果您在控制器中需要它,例如:

<?php

namespace MyBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class MyController extends Controller
{
    public function myAction()
    {
        $currentYear = $this->get('current_year_provider')->getCurrentYear(); 
    }
}
然而,如果你只需要获得当年,这似乎很愚蠢。在我看来。