2011-12-28 18 views
3

我正在寻找关于如何构建Symfony 2.0应用程序的最佳实践的一些指导。如果我有几个捆绑包(Cart Bundle,Product Bundle,CMS Bundle),并且我希望在编写页面时使用所有这些捆绑包的各个方面,我应该如何最好地执行此操作?Symfony捆绑组合,我如何在使用多个捆绑包时构造我的代码

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

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

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

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

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

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

不想spoon,,只是在正确的方向微调。谢谢。

+0

刚看到一个很老的问题upvote。答案是在适当的地方使用子请求,并在适当的地方使用树枝扩展。上面讨论的第二个选项在您的应用程序开始增长时甚至不是一个可行的选项。它也可怕地耦合到个人捆绑。 TL; DR。 1 – calumbrodie 2013-06-13 20:15:57

回答

1

我认为重要的是摆脱这样的想法,为了生成一个“页面”,必须将所涉及的模板可能需要渲染的所有变量汇集在一起​​,然后将这些变量传递给一个模板。一个控制者应该只为它所服务的请求做特定的事情,不要再做。因此,如果某个特定产品在某个网址中引用了该网址,请抓取该产品并将其传递到模板中。如果有一个特定的产品被引用但它不存在,或者不应该显示,那么您以404/410 /适当的方式回应。如果存在特定的集合,则获取集合并将其传入。路由/控制器应解码请求 - URL本身,HTTP方法等 - 并将其转换为特定的东西。一般而言并非特定于某个特定请求的东西不属于那里。

同样重要的是,我会说,尽可能地抽象您可以使用从树枝模板使用的包。我主张更多地将模板“拉”到需要的内容中,而不是被推入,但这是通过定义捆绑中的Twig函数来实现的,它们本身可以通过DI容器将数据绑定到可能或不可能在当前的请求中,等等。因此,您可以创建一个Twig函数,它可以将任何可能更改的参数作为参数 - 如果它与产品类别有关,则让它将产品类别对象作为参数。

基本上答案是更多1)比2),但你不应该直接通过Twig访问服务 - 你应该通过函数进行代理,这些函数可以在模板中产生语义意义,它们本身被定义为将服务注入到他们在运行时,您可以随意在您包含或写入的任何新捆绑包中定义不同的服务。

+0

具体示例。如果我访问产品路线,则使用ClientProductBundle提供此请求。我的软件包将获取产品对象并将其传递给我的模板(该模板也驻留在ClientProductBundle中)。该模板从/ app/Resources扩展基本模板。我在什么阶段访问我需要访问的“ClientCart”捆绑包,以显示用户购物车中的物品数量?我能看到做到这一点的唯一方法是让我的基本模板能够直接访问它。否则,我无法弄清楚(在执行路径中)我访问ClientCart软件包 – calumbrodie 2011-12-28 13:58:28

+0

编辑:您是否说我的方法(1)是正确的,但我应该间接访问购物车服务?在这种情况下,我将如何做到这一点(从树枝)? – calumbrodie 2011-12-28 14:00:39

+0

[这个问题]的答案(http://stackoverflow.com/questions/8450465/fetching-data-through-a-custom-repository-in-a-twig-extension)是否能够帮助你?在显示用户购物车中物品的数量的情况下,您可以定义一个名为cart_item_count()的树枝函数,并将其定义为使用购物车访问服务访问计数。重点是购物车的物品数量是特定于当前的会话,而不是特定于当前的请求,所以从控制器传递购物车信息是没有意义的。 – 2011-12-28 14:20:40