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

时间:2013-01-08 14:06:28

标签: model-view-controller symfony event-handling

我正在筹划一个基于symfony2的网站。默认布局将包含以下块:

  • 主标题菜单
  • 辅助侧菜单
  • 页脚中的站点地图
  • 登录表格
  • 搜索
  • 民意调查问题
  • 购物车

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

我找不到一个好答案的是:如何让这一切一起跳舞?如果他们的路线被触发并返回我的主要标题菜单包或FOSUserBundle一个回应。但这没用。我需要一些东西,所有这些构建块都会处理并呈现它们(几乎)的部分,而不管触发的路径是什么。

这对形式特别有意义。如果提交表单,则应通过适当的操作进行处理。但之后所有其他块都应该在返回整个页面之前呈现它们的内容。

如果你知道Drupal:我可以在一个块中实现一个表单。我只处理这个块,而不必关心页面上的所有其他内容。

如果您知道Java/SWING:我可以将操作或对话框实现为自包含的内容。该框架注重保持其他所有内容都是最新的。

2 个答案:

答案 0 :(得分:1)

如果我理解正确,您希望在网站的不同区域显示不同的网址,是否正确?

如果是这种情况,请在layout.html.twig(或base.html.twig或您可能称之为的任何内容)中设置要包含在页面上的块

示例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>

如果要包含平面树枝模板,请使用“包含”。如果您在加载前需要一个需要处理的块,请使用'render'。

示例页面(IE:AcmeUserBundle:注册: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 %}

上面的示例将围绕您的register.html.twig,其中包含layout.html.twig中定义的所有块。查看symfony文档的“包含其他模板”部分:http://symfony.com/doc/2.0/book/templating.html#including-other-templates

答案 1 :(得分:0)

如果要包含将调用其他复杂渲染的复杂块,则Twig包含是不够的。我认为您应该查看依赖注入器,服务等。例如,您可以创建一个Twig服务,从数据库中获取最后一个“轮询问题”并很好地显示它。如果您对某些代码感兴趣,请随时发表评论。