32

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

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

在 symfony2 中正确的表示是什么?我应该有

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

...或者我在这方面完全错了吗?

4

3 回答 3

15

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

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

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

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


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

快捷方便:

  • 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的想法,因为您仍然需要在一个地方编辑代码,然后更新两个副本。)

于 2011-05-22T07:36:21.490 回答
11

我理解捆绑包的方式是它类似于 CMS 之类的东西,例如 Typo3 或 Drupal 称之为“插件”。因此,理想情况下,它应该是独立的,并且以一种也可以用于其他项目的方式编写。

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

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

如果你保持一切尽可能抽象和可重用,那么你甚至可以在 Symfony 2 Bundle 存储库中发布 newsBunde 并与社区分享!

于 2011-04-24T14:25:00.000 回答
1

我对 Symfony2 捆绑包的看法是它们提供了一个模块化系统,它不仅允许您扩展和覆盖 php 代码,还允许您扩展和覆盖它们可能包含或不包含的任何资源。

话虽如此,假设您有一个 API,并且您想要传输一个对象。
你会怎么做?

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

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

  1. 客户端的一个捆绑包 -MyCompany/ClientBundle
  2. 服务器端的一个捆绑包 -MyCompany/ServerBundle
  3. 一个包含我希望能够传输的所有数据传输对象的捆绑包 - MyCompany/CommonBundle.

在我的内部,我MyCompany/CommonBundle将拥有用于数据传输对象的类以及我必须提供的序列化规则JMSSerializerBundle。它们可能是 xml、yml 或 php 注释的形式。

一旦你有一个用数据填充的对象,你就可以使用它returnFosRestBundle为你序列化它。序列化将取决于路由,因此您可以将对象序列化为一个系统的 XML 和另一个系统的 JSON。关键是你有不同的序列化格式和版本控制,你可以在以后使用。

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

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

我希望我设法解释了这一点。任何问题?
在评论中询问。将相应地更新答案。

于 2015-12-30T18:33:05.447 回答