我是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()
方法将非常干净和干燥。然后,服务数据从主控制器设置,并可从嵌入式控制器中的服务容器中检索。
答案 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