我目前正在使用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 namespace 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独立,所以我还没有找到任何相关的文档。
请告知。
UPDATE1:
通过不工作,我的意思是我得到500服务器错误。我运行error_reporting(E_ALL)无济于事。
当我从扩展程序中删除单词extends Twig_Extension
时,错误就解除了。
UPDATE2:
我意识到这是命名空间问题。因为我从UtilityExtension.php中删除了namespace UtilityTwigExtension;
,服务器500错误消失了。
所以我把namespace UtilityTwigExtension;
放回去,然后打电话给
require_once '../vendor/twig/twig/ext/utility/UtilityExtension.php';
$twig->addExtension(new UtilityTwigExtension\Utility_Twig_Extension());
错误又回来了。
问题:如果我坚持使用命名空间,如何调用TwigExtension?有没有更好的方法来使用命名空间?
UPDATE3:
在尝试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';
}
}
答案 0 :(得分: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';
}
}