为所有Twig模板设置全局静态参数很容易,例如:How to get config parameters in Symfony2 Twig Templates
但是说,我希望在页面上的任何地方显示今年(例如,在版权的页脚中) - 这可以通过例如在PHP中:
date("Y")
现在,如何让它可用于所有树枝模板,而无需在每个控制器中传递它?
答案 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();
}
}
然而,如果你只需要获得当年,这似乎很愚蠢。在我看来。