首页 > 解决方案 > Twig 弃用了“base_template_class”如何用较新的 Twig 覆盖或挂钩“渲染”?

问题描述

我有自己的模板类,它做了这样的事情:

    public function render(array $context)
    {
        // App & Twig
        $app = App::getInstance();
        $twig = $app->twig;

        // Figure out which textdomain should be used
        $prevTextDomain = textdomain(null);
        textdomain($twig->getRenderTextDomain());

        // Added helper variables, like isAdmin, isApi, isFront, am(assetmanager).
        $context = array_merge($context, $twig->getRenderAttributes());

        // Render
        $data = parent::render($context);

        // Set back to previous text domain
        if (isset($prevTextDomain))
        {
            textdomain($prevTextDomain);
        }

        return $data;
    }

但是现在这已被弃用,但我还没有看到任何新的方法?必须有,为什么他们会弃用东西而不给出实现相同目标的新方法?那么没有 应该怎么做base_template_class呢?

我看过一些关于 doEnterNode/doLeaveNode 钩子是新的推荐方式的讨论。但是据我所知,我可能可以在那里实现该文本域逻辑,但是如何将自定义变量添加到上下文中呢?

此外,doEnterNode/doLeaveNode 听起来比覆盖渲染增加了更多开销。

所以问题是,如何在没有 的情况下实现这一目标base_template_class


更新7.1.2020

仍然没有解决方案,但也许我应该评论我所做的解决方法。

这不是完美的解决方案,但就我而言,至少现在似乎已经足够了。

因为我认为在重要的情况下我不会调用模板的渲染,所以将我的所有template->render调用更改为myTwig->render执行 textdomain 和调用的调用twig->render

但是如果在某些情况下模板会调用另一个模板的渲染,并且它需要使用不同的文本域,那么我认为这不起作用并且我没有任何解决方案可以提供。所以让这个仍然开放。

标签: twig

解决方案


推荐阅读