【问题标题】:(Twig) Dynamically generated parameters(Twig) 动态生成的参数
【发布时间】:2014-10-14 17:53:43
【问题描述】:

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

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

date("Y")

现在,如何使其可用于所有 twig 模板,而不需要在每个控制器中传递它?

【问题讨论】:

    标签: php symfony


    【解决方案1】:

    您应该创建一个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(); 
        }
    }
    

    但是,如果您只需要获取当前年份,这似乎很愚蠢。在我看来。

    【讨论】:

    • 仅仅一年,是的。 ;) 但是,如果您有许多相关的参数,并且可能(现在我这么认为)相关的方法可能会有所帮助,那么将参数作为服务可能并不是一个坏主意。毕竟,全局参数是通过使用服务(容器)来访问的,不是吗。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2018-11-11
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多