Symfony包组合,如何在使用多个包时构建我的代码

时间:2011-12-28 10:12:30

标签: symfony soa bundle twig

我正在寻找有关如何构建Symfony 2.0应用程序的最佳实践的一些指导。如果我有一些软件包(Cart Bundle,Product Bundle,CMS Bundle),我希望在编写页面时使用所有这些软件包的各个方面,我该如何做到最好呢?

我可以想象有两种方法可以做到这一点,但我正在寻找指导哪些(如果有的话)是正确的。

1)通过服务公开我的捆绑包的所有功能,并且可以直接在枝条内使用这些服务。这样我可以将我的路由请求传递给最合适的包(所以http://myclient.org/User/Account)传递给ClientUser包进行处理,但导航中有迷你购物车的基本模板能够访问它的信息需要直接从树枝内部(我不需要传递它)

2)创建一个访问所有其他捆绑包的捆绑包,以构建页面(如VendorFrontend或VendorBackend)。这意味着所有路由请求都将传递给此捆绑包,此捆绑包将在传递给模板之前访问页面每个部分所需的信息。

第一个选项感觉不对,因为我不确定是否可以让Twig直接使用服务(通过服务容器)?

第二个选项感觉不对,因为它就像使用第二个路由器一样,路由将被传递到一个bundle,它只存在于组成其他bundle(这里给出的是这个bundle紧密耦合到它使用的bundle) )。当然,这违背了代码可重复使用的“捆绑”概念。

在这个例子中,我试图建立一个非常简单的e-com网站,仅用于演示目的。我有一个基本模板,它将有一个主导航,迷你购物车,“正文”和页脚。我将它存储在/ app / Resources目录中。我计划让所有其他模板继承这个模板并覆盖'body'区域。

不希望被人捏造,只是朝着正确的方向轻推。感谢。

1 个答案:

答案 0 :(得分:1)

我认为放弃这样的想法是非常重要的,即为了生成“页面”,必须将所涉及的模板所需的所有变量集中在一起以进行渲染,然后将这些变量传递给模板。控制器应该只为它所服务的请求执行特定的操作,而不是更多。因此,如果URL中引用了特定产品,请获取产品并将其传递到模板中。如果引用了特定产品但它不存在或不应显示,则以404/410 /适当的方式回复。如果有特定的集合,则获取集合并将其传入。路由/控制器应解码请求 - URL本身,HTTP方法等 - 并将其转换为特定的内容。任何一般而非特定于特定请求的内容都不属于那里。

我想说,尽可能抽象出你在Twig模板中使用的捆绑包也很重要。我提倡更多的模板“拉”它需要的东西,而不是被推入,但这是通过在捆绑中定义Twig函数来实现的,这些函数本身可以通过DI容器钩入可能会或可能不会的数据因此,您可以创建一个Twig函数,该函数可以将任何可能更改的参数作为参数 - 如果它与产品类别有关,则让它将产品类别对象作为参数。

基本上答案是1)而不是2),但你不应该直接通过Twig访问服务 - 你应该通过在模板中具有语义意义的函数代理,它们本身被定义为将服务注入到它们中在运行时,您可以自由地在包含或写入的任何新包中定义不同的服务。