【问题标题】:When writing a Twig Extension in Symfony, why must you provide a getName()?在 Symfony 中编写 Twig 扩展时,为什么必须提供 getName()?
【发布时间】:2015-12-18 08:57:03
【问题描述】:

这是编写 Twig 扩展的 Symfony 指南:http://symfony.com/doc/current/cookbook/templating/twig_extension.html

注意它说提供:

// src/AppBundle/Twig/AppExtension.php
namespace AppBundle\Twig;

class AppExtension extends \Twig_Extension
{
    public function getName()
    {
        return 'app_extension';
    }
}

这里是 Twig API:https://github.com/twigphp/Twig/blob/1.x/lib/Twig/Extension.php

那里没有 getName function()。

那么为什么我们必须提供一个?它有什么用途?

【问题讨论】:

    标签: php symfony twig


    【解决方案1】:

    Twig_ExtensionInterfaceTwig_Extension实现的,getName()需要根据接口在你自定义的twig扩展中实现。

    根据 sensiolabs (link here) 人员的 twig 文档:

    为了让你的扩展类保持简洁,它可以从内置的Twig_Extension 类继承而不是实现整个接口。这样,您只需要实现getName() 方法,因为Twig_Extension 为所有其他方法提供了空实现。

    getName() 方法必须为您的扩展返回一个唯一标识符。

    【讨论】:

    • 旁注:getName() 方法也被Twig_Environment 用于注册和检索扩展名。见getExtension
    • Twig 2.X 开始,(强制)函数getName() 已从interface 中删除
    【解决方案2】:

    方法getName()定义在Twig_ExtensionInterface中,由Twig_Extension实现。

    来源:https://github.com/twigphp/Twig/blob/1.x/lib/Twig/ExtensionInterface.php

    这是确保每个扩展程序都有名称的好方法。

    【讨论】:

      【解决方案3】:

      就像@DarkBee 在他的评论中提到的那样,类Twig_ExtensionInterfacegetName() 方法已在Twig 2.0 版中被删除。

      Twig 1.x API 我们可以看出,该方法自 1.26 版以来已被弃用,并在 2.0 版中被删除。在changelog也可以看到:

      1.26.0 (2016-10-02)

      • ...
      • 已弃用Twig_ExtensionInterface::getName()

      此外,寻找例如在getExtension($name) method in Environment.php of Twig version 1.25.0,我们可以看到该方法用于通过其名称获取扩展名,而在version 1.26.0version 2.4.4中,该方法用于通过其类名。

      所以,

      • 如果您使用 Twig 1.25 或更早版本,则需要实现 getName() 方法。
      • 如果您使用 Twig 版本 1.26.0(2016 年 10 月 2 日发布)或更高版本,或者版本 2.x,则不应实现 getName() 方法。 (嗯,你可以,但 Twig 不使用它。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-14
        • 1970-01-01
        相关资源
        最近更新 更多