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

时间:2014-10-16 06:40:02

标签: php symfony scope

我是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,并在footerAction()中的PageComponentController中渲染页脚。

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

更新(基于寡头的答案的解决方案):

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

1 个答案:

答案 0 :(得分:2)

我认为最明智的是使用一种服务来检索你想要的所有数据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