0

我目前使用 v1.12.2 Twig 作为独立的模板引擎。

我在一个名为 UtilityExtension.php 的文件中编写了一个名为 Utility_Twig_Extension 的 Twig 扩展

和一个 index.php

//index.php
require_once '../vendor/twig/twig/lib/Twig/Autoloader.php';
Twig_Autoloader::register();

$loader = new Twig_Loader_Filesystem(OEBPS);
$twig = new Twig_Environment($loader, array(
    'cache' => APP . DS . 'cache',
));

require_once '../vendor/twig/twig/ext/utility/UtilityExtension.php';

$twig->addExtension(new Utility_Twig_Extension());

这里是 UtilityExtension.php //UtilityExtension.php 命名空间 UtilityTwigExtension;

class Utility_Twig_Extension extends Twig_Extension
{
    public function getName()
    {
        return "utility";
    }

}

这是我的目录结构:

src
 |__app
 |    |__ index.php
 |__vendor
      |__twig
           |__twig
               |__ext
               |__lib

我什至无法正确加载文件。

我已经将问题追溯到扩展类试图扩展 Twig_Extension.php 的事实。

所以我require_once是Twig_Extension,它是UtilityExtension.php 中的Extension.php 文件。但是,仍然无法正常工作。

大多数文档都谈到在 Symfony 的上下文中添加自定义的 Twig 扩展。

我正在使用独立的 Twig,所以我还没有找到任何关于它的文档。

请指教。

更新1:

通过不工作,我的意思是我收到 500 服务器错误。我跑了 error_reporting(E_ALL) 无济于事。

当我extends Twig_Extension从扩展类中删除单词时,错误就得到了缓解。

UPDATE2: 我意识到这是一个命名空间问题。因为我 namespace UtilityTwigExtension;从 UtilityExtension.php 中删除了,并且服务器 500 错误消失了。

所以我把namespace UtilityTwigExtension;后面然后打电话

require_once '../vendor/twig/twig/ext/utility/UtilityExtension.php';

$twig->addExtension(new UtilityTwigExtension\Utility_Twig_Extension());

错误又回来了。

问题:如果我坚持使用命名空间,如何调用 TwigExtension?有没有更好的使用命名空间的方法?

更新3:

尝试 Luceos 回答后,我仍然得到服务器 500。

error_reporting(E_ALL);
require_once 'constants.php';

require_once 'ZipLib.php';

require_once '../vendor/twig/twig/lib/Twig/Autoloader.php';
Twig_Autoloader::register();

$loader = new Twig_Loader_Filesystem(OEBPS);

$twig = new Twig_Environment($loader, array(
    'cache' => APP . DS . 'cache',
));

require_once '../vendor/twig/twig/ext/utility/UtilityExtension.php';

use UtilityTwigExtension\Utility_Twig_Extension;

$twig->addExtension(new Utility_Twig_Extension());

UtilityExtension.php

namespace UtilityTwigExtension;

class Utility_Twig_Extension extends Twig_Extension
{
    /**
     * Returns the name of the extension.
     *
     * @return string The extension name
     */
    public function getName() {
        return 'utility';
    }

}
4

1 回答 1

1

因此,让我们将评论放在一个答案中,然后从那里继续前进,不要挤满评论:

首先从正确的命名空间调用扩展:

use UtilityTwigExtension\Utility_Twig_Extension;
$twig->addExtension(new Utility_Twig_Extension());

使用和命名空间调用通常放在文件的顶部。

您也可以尝试使用以下方法直接调用命名空间 + 对象:

$twig->addExtension(new UtilityTwigExtension\Utility_Twig_Extension());

更新 3

Utility_Twig_Extension 从不存在的命名空间 UtilityTwigExtension 扩展 Twig_Extension。我假设 Twig_Extension 不在任何命名空间中,因此您将使用 \Twig_Extension:

namespace UtilityTwigExtension;

class Utility_Twig_Extension extends \Twig_Extension
{
    /**
     * Returns the name of the extension.
     *
     * @return string The extension name
     */
    public function getName() {
        return 'utility';
    }

}
于 2013-03-13T12:46:09.937 回答