在Symfony中编写Twig扩展时,为什么必须提供getName()


When writing a Twig Extension in Symfony, why must you provide a getName()?

以下是编写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函数()。

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

看看Twig_Extension实现的Twig_ExtensionInterfacegetName()需要根据接口在您的自定义分支扩展中实现。

根据sensiolabs的人员的树枝文档(此处链接):

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

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

方法getName()Twig_Extension实现的Twig_ExtensionInterface中定义。

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

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

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

从Twig 1.x API中,我们可以看到该方法从1.26版本开始就被弃用,并在2.0版本中被删除。它也可以在变更日志中看到:

1.26.0(2016-10-02)

  • 已弃用的Twig_ExtensionInterface::getName()

此外,例如,查看Twig版本1.25.0的Environment.php中的getExtension($name)方法,我们可以看到该方法用于通过其名称获得扩展,而在版本1.26.0和版本2.4.4中,该方法用于根据其类名来获得扩展。

所以,

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