如何建立一个不平凡的Symfony2网站组成的许多控制器



我正在计划一个基于symfony2的网站。默认布局将由以下块组成:

  • 主标题菜单
  • 辅助侧菜单
  • 站点地图页脚
  • 登录表单
  • <
  • 调查问题/gh>购物车

对于每个部分,我都知道如何通过编写控制器和Twig模板来编写Symfony2中的代码。对于某些部分,我打算使用包,如FOSUserBundle,它提供了自己的控制器。

我找不到一个好的答案是:我怎么能让这一切一起跳舞?如果primary-header-menu bundle或FOSUserBundle的路由被触发并返回一个响应,它们就会上升。但这没有用。我需要一些东西,所有这些构建块处理和渲染他们的部分(几乎)不管什么路由被触发。

这对于表单来说特别有趣。如果提交了表单,则应该通过适当的操作来处理它。但是之后所有其他块应该在整个页面返回之前呈现它们的内容。

如果你了解Drupal:我可以在块中实现表单。我只处理这个块,不需要关心页面上的其他东西。

如果你知道Java/SWING:我可以实现一个动作或对话框作为一个自包含的东西。

如果我理解正确,你想从你的网站的不同区域在你的页面上显示不同的块,对吗?

如果是这种情况,请在layout.html.twig(或base.html)中设置要在页面上包含的块。树枝,或者随便你叫它什么)

layout.html.twig例子:

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>Acme Example Page</title>
    </head>
    <body>
        <div id="sidebar">
            <div id="sidebar-menu-block" class="block">
                {% include 'AcmeBundle:Sidemenu:sideMenu.html.twig' %}
            </div>
            <div id="sidebar-cart-block" class="block">
                {% render url('acme_shopping_cart_block_url') %}
            </div>
            <div id="sidebar-poll-block" class="block">
                {% render url('acme_poll_block_url') %}
            </div>
        </div>
        <div id="content">
            {% block body %}{% endblock %}
        </div>
    </body>
</html>

如果你想包含一个扁平的小树枝模板,使用'include'。如果你需要一个在加载前需要处理的块,使用'render'。

示例页面(IE: AcmeUserBundle:Registration:register.html.twig):

{% extends 'layout.html.twig' %}
{% block body %}
<h1>My Page with a form!</h1>
<form>
   {{ form_widget(form) }}
   <input type="submit" value="Save" />
</form>
{% endblock body %}
上面的示例将用layout.html.twig中定义的所有块包围register.html.twig。查看symfony文档中的"包括其他模板"一节:http://symfony.com/doc/2.0/book/templating.html#including-other-templates

如果你想包含调用其他复杂渲染的复杂块,那么Twig include是不够的。我认为你应该看看依赖注入器、服务之类的东西。例如,您可以创建一个Twig Service,它从数据库中获取最后一个"Poll Question",并很好地显示它。如果您对某些代码感兴趣,请随意注释。

最新更新