2012-02-29 25 views
7

Cách thích hợp để kết nối bộ lọc tùy chỉnh với Twig khi sử dụng Silex là gì, nhưng giữ nguyên số twig.options hiện tại?Twig addFilter sử dụng Silex?

Đây là ý của tôi. Tôi có mã sau:

$app->register(new Silex\Provider\TwigServiceProvider(), array(
    'twig.path' => dirname(__FILE__).'/view', 
    'twig.class_path' => dirname(__FILE__).'/vendor/twig/lib', 
    'twig.options' => array('cache'=>'folder/twig') 
)); 

function test() { 
    return 'yay'; 
} 

$app['twig']->addFilter('test',new \Twig_Filter_Function('test')); 

Nếu tôi chạy mã đó, bộ lọc KHÔNG LÀM VIỆC. Thay vào đó, Twig trả về một phiên bản lưu trữ vô hạn của PREQUIOUS YÊU CẦU (ngay cả khi tôi xóa nội dung trong bộ nhớ cache - tôi đoán đây là vì bộ nhớ cache đang được lưu trữ ở nơi khác vì tôi ghi đè twig.options ... không chắc chắn).

Tuy nhiên, nếu tôi mương dòng sau:

'twig.options' => array('cache'=>'folder/twig') 

... sau đó mọi thứ hoạt động.

Làm cách nào để hai người có thể chơi độc đáo? tức là giữ bộ nhớ cache VÀ thêm bộ lọc tùy chỉnh?

Cảm ơn!

Trả lời

20

Bạn nên tạo tiện ích mở rộng cành và thêm bộ lọc của bạn ở đó.

#src/Insolis/Twig/InsolisExtension.php (snippet) 
<?php 

namespace Insolis\Twig; 

class InsolisExtension extends \Twig_Extension 
{ 
    public function getName() { 
     return "insolis"; 
    } 

    public function getFilters() { 
     return array(
      "test"  => new \Twig_Filter_Method($this, "test"), 
     ); 
    } 

    public function test($input) { 
     return "yay"; 
    } 
} 

Làm thế nào để đăng ký nó:

#app/bootstrap.php 
$app["twig"] = $app->share($app->extend("twig", function (\Twig_Environment $twig, Silex\Application $app) { 
    $twig->addExtension(new Insolis\Twig\InsolisExtension($app)); 

    return $twig; 
})); 
+0

trình một cách hoàn hảo, cảm ơn! –

+0

Có thể liên kết tốt với tài liệu hướng dẫn về chủ đề này: http://twig.sensiolabs.org/doc/advanced.html#creating-an-extension – Ascherer

Các vấn đề liên quan