如何在树枝上将变量共享给所有视图(包括行为)?

时间:2019-05-15 11:20:49

标签: symfony twig

我有此控制器操作:

   public function index(Request $request)
    {
        $start = $request->get('start', 0);
        $limit = $request->get('limit', 10);
        $articles = $this->articleRepository->all($start, $limit);
        $navigation = $this->menu->build()->render(new RenderStrategyBootstrap4());

        return $this->render('article/index.html.twig', [
            'articles' => $articles,
            'navigation'=>$navigation
        ]);
    }

我使用以下菜单构建菜单

$navigation = $this->menu->build()->render(new RenderStrategyBootstrap4());

现在这是高级行为,我不想为其中的每个动作都渲染它。在Symfony中,有没有一种方法可以将此行为移至某种视图编写器(例如Laravel中),然后与视图共享该变量?

还是没有办法,我需要创建基本控制器吗?

1 个答案:

答案 0 :(得分:1)

您可以按照以下说明创建自定义树枝扩展名:https://symfony.com/doc/current/templating/twig_extension.html

您可以在其中注册一个自定义的Twig函数,如下所示:

     var addedItems = [];
     var item = {};
     item["TId"] = "";
     item["VNo"] = "";
     item["IDate"] = "";
     item["Rate"] = 22;
     item["ItemId"] = 12;
     item["Quantity"] = 1;
     item["ItemTypeId"] = 3;
     addedItems.push(item);

     removeValueFromObjectByValue(addedItems,12);


     function removeValueFromObjectByValue(jsonObject, value) {
        jQuery.each(jsonObject, function (i, val) {
            if (val.ItemId == value) // delete index
            {
                return;
                delete jsonObject[i];
                return;
            }
        });
    }

然后,您可以在每个模板中使用该功能,例如public function getFunctions() { return array('renderNavigation' => new TwigFunction( 'renderNavigation', array($this, 'renderNavigation'), array('needs_environment' => true, 'is_safe' => array('html')) ); } public function renderNavigation(Environment $twig) { /* ... */ return $twig->render(/* ... */); }

由于Twig Extension本身是一项服务,因此您可以注入其他所需的任何服务(例如RequestStack,EntityManager等),如果您需要运行多个功能,甚至可以在扩展中缓存昂贵的操作。