从树枝延伸渲染模板

Ste*_*ano 15 php dependency-injection symfony twig

我已经构建了一个枝条扩展来做一些事情,其中​​一个是渲染模板.如何从枝条扩展内部访问引擎环境并调用Render方法?

tvl*_*ooy 40

您可以定义扩展以使其需要环境.Twig会自动将其传递给该函数.

public function getFunctions()
{
    return array(
        new \Twig_SimpleFunction(
            'myfunction',
            array($this, 'myFunction'),
            array('needs_environment' => true)
        ),
    );
}

public function myFunction(\Twig_Environment $environment, string $someParam)
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

  • \弃用Twig_Function_Method,使用\ Twig_SimpleFunction (4认同)

Ste*_*ano 19

使用此功能,用户可以将树枝环境实例传递给树枝扩展

private $environment;

public function initRuntime(\Twig_Environment $environment)
{
    $this->environment = $environment;
}
Run Code Online (Sandbox Code Playgroud)

  • 然后执行$ this-> environment-> render() (5认同)
  • initRuntime现已弃用.@tvlooy的needs_environment是正确的答案. (4认同)

Rob*_*ert 7

@tvlooy回答给我一个提示,但对我没用.我需要达到的目的是:

namespace AppBundle\Twig;


class MenuExtension extends \Twig_Extension
{
    public function getName()
    {
        return 'menu_extension';
    }

    public function getFunctions()
    {
       return [
           new \Twig_SimpleFunction('myMenu', [$this, 'myMenu'], [
               'needs_environment' => true,
               'is_safe' => ['html']
           ])
       ];
    }

    public function myMenu(\Twig_Environment $environment)
    {
          return $environment->render('AppBundle:Menu:main-menu.html.twig');
    }
}
Run Code Online (Sandbox Code Playgroud)

我需要添加'is_safe' => ['html']addtionaly以避免HTML的自动转换.

我还将这个类注册为symfony服务:

app.twig.menu_extension:
    class: AppBundle\Twig\MenuExtension
    public: false
    tags:
      - { name: twig.extension }
Run Code Online (Sandbox Code Playgroud)

我在TWIG模板中添加了 {{ myMenu() }}

我使用"twig/twig": "~1.10"和Symfony 3.1.3版本