2013-12-18 1 views
4

나는이 작품이정적 메서드를 사용하지 않고 사용자 정의 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; 
    } 
} 

처럼 내 프로젝트에 대한 나뭇 가지 확장을 만들 수 있습니다,하지만 난 일부 기능에 필요한 일부 데이터를 삽입하는 생성자를 사용하고 싶습니다.

는 간단하게 모든 다른 방법에 대한 extend Twig_Function 템플릿 기능을 지정하는 모든 다른 클래스에서 functon에게 loremipsum()

답변

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

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

봐를 실행하려고 PHP가 발생합니다 Twig_SimpleFunction'asset'를 사용하여. Twig_SimpleFunction 새로운 들어

, 당신이 생성자에 두 번째 인수로 callable의 어떤 종류를 전달할 수 있습니다 보인다 나뭇 가지 버전 1.23.1에서

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

슬프게도,'Twig_Function_Method' (뿐만 아니라 모든'Twig_Function_ *'클래스)는 더 이상 사용되지 않습니다. 2.0에서 제거 될 것입니다. – SkaveRat

+1

내 확장 기능이 아직 2.0으로 변경되지 않았습니다. 업데이트를 참조하십시오. – deceze

+0

굉장합니다. 호출 가능 배열과 함께 작동합니다. – SkaveRat

3

업데이트 다음과 같이 최대 그건 :

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} 
관련 문제