【发布时间】:2014-10-14 17:53:43
【问题描述】:
很容易设置全局静态参数可用于所有 Twig 模板,例如:How to get config parameters in Symfony2 Twig Templates
但是说,我想在页面上的任何地方显示 当前年份(例如,在版权页脚中) - 这可以通过例如在 PHP 中:
date("Y")
现在,如何使其可用于所有 twig 模板,而不需要在每个控制器中传递它?
【问题讨论】:
很容易设置全局静态参数可用于所有 Twig 模板,例如:How to get config parameters in Symfony2 Twig Templates
但是说,我想在页面上的任何地方显示 当前年份(例如,在版权页脚中) - 这可以通过例如在 PHP 中:
date("Y")
现在,如何使其可用于所有 twig 模板,而不需要在每个控制器中传递它?
【问题讨论】:
您应该创建一个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();
}
}
但是,如果您只需要获取当前年份,这似乎很愚蠢。在我看来。
【讨论】: