2013-12-18 4 views
4

я могу создать расширение Twig для моего проекта, как этогоКак создать собственный класс функций Twig, не используя статический метод?

class Functions extends Twig_Extension{ 
    public function getName(){return 'foobar';} 

    public function getFunctions() { 
     return array(
      'loremipsum' => new \Twig_SimpleFunction('asset', 'Functions::loremipsum') 
     ); 

    public static function loremipsum($foo) { 
     return $foo; 
    } 
} 

это работает, но я хочу использовать конструктор, чтобы ввести некоторые данные, которые мне нужны в некоторых функциях.

Просто с помощью 'asset' в Twig_SimpleFunction приведет к PHP попытке выполнить functon loremipsum()

ответ

8
public function getFunctions() { 
    return array(
     'foo' => new Twig_Function_Method($this, 'bar'); 
    ); 
} 

public function bar($baz) { 
    return $this->foo . $baz; 
} 

Посмотрите на все различные классы, которые extend Twig_Function для всех различных способов задания функции шаблона.

Для новее Twig_SimpleFunction, кажется, вы можете пройти любой вид callable в качестве второго аргумента в конструктор:

new Twig_SimpleFunction('foo', array($this, 'bar')) 
+1

К сожалению, 'Twig_Function_Method' (как и все классы' Twig_Function_ * ') устарел. Он будет удален в 2.0 – SkaveRat

+1

Я вижу, еще не коснулся 2.0 моими расширениями. См. Обновление. – deceze

+0

удивительный. работает с вызываемым массивом – SkaveRat

3

Update из прута версии 1.23.1 и выше это выглядит следующим образом:

class LogoExtension extends \Twig_Extension 
{ 

    public function getFunctions() 
    { 
     return array(
      new \Twig_SimpleFunction('logo', array($this, 'logo'), array('is_safe' => array('html'))), 
     ); 
    } 

    public function logo() 
    { 
     return 'result'; 
    } 


    /** 
    * {@inheritdoc} 
    */ 
    public function getName() 
    { 
     return 'logo'; 
    } 
} 

И, конечно же, вы добавляете этот класс расширения в качестве расширения ветки для файла конфигурации services.yml.

services: 
    company.twig.extension.logo: 
     class: Acme\DemoBundle\Twig\Extension\LogoExtension 
     tags: 
      - { name: twig.extension} 
Смежные вопросы