Symfony bundle composition,在使用多个bundle时如何构造代码

Symfony bundle composition,在使用多个bundle时如何构造代码,symfony,soa,bundle,twig,Symfony,Soa,Bundle,Twig,我正在寻找有关如何构建Symfony 2.0应用程序的最佳实践的指导。如果我有几个捆绑包(购物车捆绑包、产品捆绑包、CMS捆绑包),并且我希望在撰写页面时使用所有这些捆绑包的各个方面,我应该如何最好地做到这一点 我可以想象有两种方法可以做到这一点,但我正在寻找正确的指导 1) 通过服务公开my Bundle的所有功能,并在twig中直接使用这些服务。通过这种方式,我可以将路由请求传递给最合适的捆绑包(so),并将其传递给ClientUser捆绑包进行处理,但导航中包含迷你购物车的基础模板可以直接

我正在寻找有关如何构建Symfony 2.0应用程序的最佳实践的指导。如果我有几个捆绑包(购物车捆绑包、产品捆绑包、CMS捆绑包),并且我希望在撰写页面时使用所有这些捆绑包的各个方面,我应该如何最好地做到这一点

我可以想象有两种方法可以做到这一点,但我正在寻找正确的指导

1) 通过服务公开my Bundle的所有功能,并在twig中直接使用这些服务。通过这种方式,我可以将路由请求传递给最合适的捆绑包(so),并将其传递给ClientUser捆绑包进行处理,但导航中包含迷你购物车的基础模板可以直接从细枝中访问它所需的信息(我不需要传递此信息)

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

第一个选项感觉是错误的,因为我不确定是否允许Twig直接使用服务(通过服务容器)

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

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


不想被人用勺子舀,只是朝正确的方向轻推一下。谢谢。

我认为重要的是要摆脱这样的想法,即为了生成“页面”,必须将模板可能需要的所有变量关联在一起,然后将它们传递到模板中。控制器应该只为它所服务的请求做特定的事情,而不是更多。因此,如果URL中引用了特定的产品,则获取该产品并将其传递到模板中。如果有一个特定的产品被引用,但它不存在,或者不应该被显示,那么您可以用404/410/任何合适的答案来回答。如果有特定的集合,请获取集合并将其传入。路由/控制器应该对请求(URL本身、HTTP方法等)进行解码,并将其转换为特定的内容。任何一般性的、非特定于特定请求的东西都不属于这里

我想说,尽可能地从细枝模板中抽象出所使用的捆绑包也很重要。我更主张模板将它需要的东西“拉”到它们里面,而不是推进去,但这是通过在捆绑包中定义细枝函数来实现的,这些函数本身可以通过DI容器钩住当前请求中可能存在或不存在的数据,所以你可以做一个细枝函数,它可以把任何可能改变的东西作为参数——如果它与产品类别有关,就让它把一个产品类别对象作为参数


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

特定示例。如果我访问产品路线,我将使用ClientProductBundle为该请求提供服务。My bundle将获取一个产品对象并将其传递给我的模板(该模板也位于ClientProductBundle中)。此模板从/app/Resources扩展基础模板。为了显示用户购物车中的项目数量,我需要在什么阶段访问“ClientCart”捆绑包?我能看到的唯一方法是让我的基本模板能够直接访问它。否则,我无法确定访问ClientCart bundleEdit的位置(在执行路径中):您是说我的方法(1)是正确的,但我应该间接访问cart服务吗?在这种情况下,我将如何(从细枝上)做到这一点?答案对你有帮助吗?在显示用户购物车中的项目数的情况下,您可以定义一个名为cart\u item\u count()的细枝函数,并定义该函数以使用购物车访问服务访问计数。关键是购物车项目计数特定于当前会话,而不是特定于当前请求,因此从控制器传入购物车信息没有意义。嗨,是的,这就是我计划要做的。(). 这就是我在上面的场景一中所说的“基本模板在导航中有一个迷你购物车,它可以直接从twig中访问它需要的信息(我不需要将其传入)”。我本来可以更明确一些,但我计划使用服务。您关于请求与会话的观点实际上让我意识到,我想向twig公开的几乎所有服务都与使用当前会话提取数据有关。谢谢你的澄清!刚刚看到了对这个老问题的投票。答案是在适当的地方使用子请求,在适当的地方使用细枝扩展。当应用程序开始增长时,我上面讨论的第二个选项甚至不是一个可行的选项。它还可怕地耦合到单个捆绑包。TL;一号博士