在Symfony2中的嵌入式控制器之间共享数据


Sharing data between embedded controllers in Symfony2

我是Symfony2的新手,经过几个教程后,我决定将我的项目迁移到这个框架。

在我的项目中,我有几个模块具有不同的模板但共享相同的数据。例如,菜单:菜单项从数据库中提升,并由标准网站菜单和页脚菜单使用。我读到最佳实践是为此类任务创建控制器,并将其直接嵌入到主布局中,如下所示:

//Controller
class PageComponentController extends Controller
{
    public function menuAction()
    {
        //get menu items from database...
        $menu_items = ...
        return $this->render('MyProjectBundle:PageComponent:menu.html.twig', [
            'menu_items' => $menu_items
        ]);
    }
}
//Template
{% block body %}
    {% render controller('MyProjectBundle:PageComponent:menu', { 'current_page': current_page }) %}
{% endblock %}

但是,我也需要在页脚中传递这些$menu_items,并在PageComponentController中从footerAction()中渲染页脚。

我知道有很多方法可以做到这一点,但是在Symfony2中不同的嵌入式控制器之间共享这种相互数据的最佳方法是什么?

更新(基于奥利根答案的解决方案(:

服务容器范围既可以从主控制器(负责页面呈现(访问,也可以从嵌入式控制器访问。因此,使用从数据库获取数据的方法和返回现有数据的方法编写服务类getMenu() outputMenu()干巴巴的。然后,从主控制器设置服务数据,并可以从嵌入式控制器中的服务容器中检索。

我认为最明智的是使用一种服务,该服务可以检索您想要 http://symfony.com/doc/current/book/service_container.html 的所有数据(它或多或少像一个控制器,但可以在任何地方访问(

让你知道它是什么

class MenuService
{
  public function getMyMenu()
  {
    ... your code to get the menu
  }
}

然后在捆绑包中的 services.yml 中声明它

services:
    getMenuService:
        class: ..'...'...'MenuService

然后只需通过这样做在任何控制器中使用它

$menu = $this->container->get('getMenuService');



如果必须使用模板继承,则仍可以通过执行以下操作来访问父模板中的对象

{% extends "...Bundle..:myMenu.html.twig" %}
{% set menu = myMenuTwigvar %}

然后是 myMenu 例如 menu.button1