Symfony2中的包应该代表什么

时间:2011-04-24 13:28:19

标签: php bundle symfony

这对您来说可能是显而易见的事情,但是 - 即使在阅读了大量手册和博客之后 - 我仍然不确定Symfony2中的捆绑包究竟应该代表什么。从简单的演示应用程序中很难猜到它。

例如:我有一个分为两个部分的网站(一个只是一个二级域,如example.com,另一个是dom2.example.com)。这两部分中的每一部分都有自己的一些部分 - 有时相同(如新闻)有时不同。

symfony2中对此的正确表示是什么?我应该

  • MySite\site1MySite\site2捆绑包,通过不同的控制器执行不同的部分,或
  • 捆绑Site1\NewsSite2\News,或
  • 捆绑MySite\Site1NewsMySite\Site2News等。

......或者我对此错了吗?

3 个答案:

答案 0 :(得分:15)

我也是Symfony的新手,我会兴趣地关注这个问题的结果,但是对于它的价值,我的看法是:

捆绑就是:一组文件,资产,PHP类和方法,测试等。分组的逻辑可以是你喜欢的任何东西。在某些情况下,分组是什么以及为什么要这样做是非常明显的 - 例如,如果我为Symfony2编写博客系统并想要发布它,我会把它变成一个包。这是文档中最常用的一种例子。

但是你也可以将捆绑包用于你想要发布的任何一个小功能。比方说,this bundle为所有控制器创建默认路由。它不是一个完全开发的插件/功能,如博客或论坛,但它是一些我可以轻松导入到我的项目中的代码,它与其他一切完全分开,它是一个捆绑。

最后,您还可以在内部对项目使用捆绑包,绝对是对您有意义的任何方式。


我对你的具体情况的看法:

快速简便:

  • MySite\MyCode - 完成工作,也许你没有任何合理的方法来分解你要编写的代码。

如果两个网站之间还有一些独特的功能,并且为了清晰起见,您希望将它们分开:

  • MySite\SharedFeatures
  • MySite\Site1Features
  • MySite\Site2Features

如果你真的喜欢所有的东西,或者你有一个复杂的项目,那么可能:

  • MySite\MySiteMain(共享功能和全能杂项,不值得拥有自己的捆绑包)
  • MySite\News
  • MySite\Site1FeatureSomethingOrOther
  • MySite\Site2FeatureSomethingOrOther

我绝对认为你想坚持逻辑组代码 - 所以我认为你的例子“捆绑Site1 \ News和Site2 \ News”和“MySite \ Site1News和MySite \ Site2News”不会不是最好的方式。 Site1和Site2是实现,因此为每个网站的新闻页面制作一个单独的包对我来说似乎适得其反;你想要创建一个新闻组件并构建它以两种不同的方式使用。

对于您的双域问题,您可以将两个域指向相同的代码,并在代码中测试所请求的域,或者您可以签出两个相同代码的副本并更改配置文件稍微(这不一定违反DRY的想法,因为你仍然在一个地方编辑代码,然后更新两个副本。)

答案 1 :(得分:11)

我理解捆绑包的方式与CMS类似,例如Typo3或Drupal称之为“插件”。因此,理想情况下它应该是自包含的,并且可以在其他项目中使用。

E.g。在您的情况下,我将创建一个“staticHtmlBundle”,其中包含您网站的所有静态页面,由site.com和dom2.site.com分隔。

然后我会创建一个包含所有新闻文章的“newsBundle”,甚至可能是数据库驱动的一个小管理部分,你可以编辑它们并将它们分配到不同的频道(在你的情况下是site.com) ,dom2.site.com)。 staticHtmlBundle中的静态页面将调用newsBundle并显示其数据(例如,新闻的listView或detailView等)。

如果您将所有内容保持为抽象和可重用,那么您甚至可以在Symfony 2 Bundle存储库中发布newsBunde并与社区共享!

答案 2 :(得分:1)

我认为Symfony2捆绑包的方式是它们提供了一个模块化系统,它不仅可以扩展和覆盖php代码,还可以覆盖它们可能包含或不包含的任何资源。

话虽如此,请考虑您有一个API并且您想转移一个对象 你会怎么做?

当然,您可以手动执行此操作,但如果Symfony可以为您执行此操作,那会不会很好?

我这样做的方法包括3个捆绑,JMSSerializerBundleFosRestBundle

  1. 客户端的一个捆绑包 - MyCompany/ClientBundle
  2. 服务器端的一个捆绑包 - MyCompany/ServerBundle
  3. 一个捆绑包含我希望能够传输的所有数据传输对象 - MyCompany/CommonBundle
  4. 在我的MyCompany/CommonBundle内部,我将拥有用于数据传输对象的类以及我必须提供JMSSerializerBundle的序列化规则。它们可以是xml,yml或php注释的形式。

    如果您的对象填满了数据,则只需使用returnFosRestBundle就可以为您序列化。序列化将取决于路由,因此您可以将对象序列化为XML,用于一个系统,而JSON用于另一个系统。关键是你有不同的序列化格式和版本,你可以在以后使用。

    在客户端,您可以使用简单的参数转换器将收到的JSON或XML转换为控制器中的对象,而无需额外的麻烦。您还可以键入一些验证规则,以便验证对象是否按预期填充。

    在我的示例中,MyCompany/CommonBundle具有将由多个应用程序使用的对象,并且将是相同的。将它作为一个单独的捆绑包可以帮助您避免代码重复,并使长期维护更容易。

    我希望我能解释一下。有问题吗?
    在评论中提问。将相应更新答案。