symfony 从细枝延伸渲染模板

xu3bshqb  于 2022-11-16  发布在  其他
关注(0)|答案(4)|浏览(125)

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

bnl4lu3b

bnl4lu3b1#

你可以定义扩展,使它需要环境。Twig会自动将它传递给函数。

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)
{
    // ...
}

对于旧版本的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)
{
    // ...
}
sbtkgmzw

sbtkgmzw2#

使用此函数,用户可以将分支环境示例传递给分支扩展

private $environment;

public function initRuntime(\Twig_Environment $environment)
{
    $this->environment = $environment;
}
xkrw2x1b

xkrw2x1b3#

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

我需要additionaly添加'is_safe' => ['html'],以避免HTML的自动转义。
我还将该类注册为symfony服务:

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

在TWIG模板中,我添加了{{ myMenu() }}
我使用"twig/twig": "~1.10"和Symfony 3.1.3版本

zzzyeukh

zzzyeukh4#

如果即使设置了needs_environment参数,问题仍然存在,则可以在如下调用方法时在模板中使用row

{{ myMenu()|raw }}

相关问题