我是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