2013-03-13 123 views
0

我目前使用v1.12.2 Twig作爲獨立模板引擎。twig:如何在不使用symfony的情況下添加Twig擴展文件

我寫了一個枝條擴展名爲Utility_Twig_Extension在一個名爲UtilityExtension.php

文件和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 Extension的文章。

我正在使用樹枝獨立,所以我還沒有找到任何文件。

請指教。

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:

我仍然得到服務器500試圖Luceos答案後。

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

[此頁](http://twig.sensiolabs.org/doc/advanced.html)樹枝網站上展示瞭如何做到這一點,並沒有提到symfony。第一個谷歌搜索結果爲「Twig add extension」 – 2013-03-13 12:29:37

+0

我遵循了那裏的步驟。除非我忽略了什麼? – 2013-03-13 12:30:54

+0

是的,但你意識到你的擴展實際上並沒有任何東西,對吧?你怎麼知道它沒有被加載? 「它不工作」__不是有用的。 – 2013-03-13 12:32:06

回答

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'; 
    } 

} 
+0

謝謝非常。我試過你的答案。但沒有解決。 UPDATE3列出了我的更改。 – 2013-03-13 12:51:54

+0

根據您的代碼更新 – Luceos 2013-03-13 12:55:14

+0

謝謝!有效。那麼我應該使用命名空間嗎? – 2013-03-13 12:56:17