Render template from twig extension

2020-05-26 03:00发布

I have built a twig extension to do some things and one of them is render a template. How can I access from inside the twig extension the engine environment and call the Render method?

3条回答
乱世女痞
2楼-- · 2020-05-26 03:32

@tvlooy answer give me a hint but didn't work for me. What I needed to to to achieve it is:

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

I needed addtionaly add 'is_safe' => ['html'] to avoid autoescaping of HTML.

I've also registered the class as symfony service:

app.twig.menu_extension:
    class: AppBundle\Twig\MenuExtension
    public: false
    tags:
      - { name: twig.extension }

in TWIG template I've added {{ myMenu() }}

I work with "twig/twig": "~1.10"and Symfony 3.1.3 version

查看更多
叼着烟拽天下
3楼-- · 2020-05-26 03:36

You can define the extension so that it needs the environment. Twig will automatically pass it to the function.

use Twig\Environment;
use Twig\TwigFunction;

public function getFunctions()
{
    return [
        new TwigFunction(
            'myfunction',
            [$this, 'myFunction'],
            ['needs_environment' => true]
        ),
    ];
}

public function myFunction(Environment $environment, string $someParam)
{
    // ...
}

For older versions of 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)
{
    // ...
}
查看更多
Summer. ? 凉城
4楼-- · 2020-05-26 03:43

Using this function the user can pass the twig environment instance to a twig extension

private $environment;

public function initRuntime(\Twig_Environment $environment)
{
    $this->environment = $environment;
}
查看更多
登录 后发表回答