php - Symfony2 概念问题 : general bundles vs. 特定问题

标签 php symfony bundle

编辑:Symfony best practices回答我的大部分问题。

我有几个关于我的 Symfony2 应用程序的问题。

它将有一个前端和一个后端,它们将使用一些通用代码(例如日期显示器、分页器、一些经常使用的模板等)。

因此,我创建了一个 FrontendBundle 和一个 BackendBundle,每个都包含例如它们各自的布局。第一个问题:为前端和后端创建 bundle 的好做法是什至没有 Controller 的“通用” bundle 吗?

第二个问题:我在一本食谱上读到我不应该把我的布局放在包里,而是放在 app/Resources/views/目录中。我已经有一个 base.html.twig 文件,我想知道我是否也应该把我的布局也放在那里,就像一个 frontend_layout.html.twig 文件?

我创建了一个名为 RootBundle 的包,它将包含我的应用程序在前端和后端所需的一切。这是一个好习惯吗?或者我应该为每个提议的功能创建一个专用包,例如 PaginatorBundle、DateDisplayerBundle 等?我有一个“杂项”包,其中包含我不知道放在哪里的所有内容,这听起来很奇怪。你是怎样做的?

最佳答案

新方法
自从我写下这个答案几个月后,我的方法发生了变化,所以我将它与社区分享。这个答案仍然很受欢迎,可以引导新人采用我认为不再是最好的方法。所以...
现在我只有特定于应用程序的 bundle ,我称之为 AppBundle .旧方法存在几个问题,以下是其中一些问题:

  • 创建大量 bundle 很乏味。 你必须为每个新包创建一个包类和一堆标准文件夹,然后激活它并注册它的路由和 DI 等等。
  • 不必要的核心决策过程。 有时您只是无法决定特定事物属于哪个 bundle ,因为它被多个 bundle 使用。在你花了半天时间并最终做出了把它放在哪里的艰难决定之后,你会发现在几天或几周内你将无法立即分辨出该放在哪个包里——因为大多数时候决定不是基于纯粹的逻辑,你必须根据掷硬币或任何你用来带来更高权力寻求帮助的方式来选择。
    我建议使用 CommonBundle对于过去常见的东西,但这样做你将不得不做很多不必要的重构,将事物移入和移出 CommonBundle基于以后有多少包会使用那个东西。
  • 无论如何,特定于应用程序的 bundle 是相互依赖的。 当人们第一次遇到 bundle 的想法时,他们脑海中的主要想法之一就是“耶!我会给我一堆可重复使用的包!”这个想法很棒,我不反对;问题是应用程序特定的包无论如何都不是可重用的——它们是相互依赖的。在这种情况下忘记重用。
  • 不知道放在哪里Behat特征和步骤定义。 这个问题与之前的问题有关:你必须对每个包重复相同的无脑 Action ,然后做出核心决定。
    当我开始编写 Behat 功能时,我无法决定将很多功能和步骤定义放在哪里,因为它们一次属于多个包。将它们放入 CommonBundle似乎更糟,因为这是我要查找的最后一个包。所以,我最终创建了 FeatureBundle为了那个原因。

  • 切换到单个包解决了所有这些问题。
    我还看到有些人有一个单独的包,比如所有实体。我也不喜欢这种方法,实际上 suggest keeping entities and other non Symfony2 specific stuff out of the bundles .
    再次注意,这种新方法适用于特定于应用程序的 bundle 。官方文档和其他地方对如何构建旨在与他人共享并在众多项目中重用的包提供了很好的建议。 I write bundles of this type以及。但是我在 Symfony2 项目上工作了几个月后发现,用于重用的包和特定于应用程序的包之间存在差异——一种方法并不适合所有。
    而且,当然,当您在特定于应用程序的包中看到可重用的东西时,只需提取它,将其放在单独的存储库中并作为供应商安装。
    此外,我发现自己更积极地使用子命名空间作为逻辑分区包的一种方式——而不是为此创建一堆包并经历所有这些麻烦。
    旧方法
    没有硬性规定或 Elixir ,但我会分享我做事的方法——也许它会给你一两个洞察力。
    首先,我没有像 FrontendBundle 这样的两个包罗万象的包。和 BackendBundle .相反,我的 bundle 同时具有前端和后端 Controller 、 View 等。因此,如果我从 UserBundle 中删除所有内容除了 Controller 和 View ,它的结构看起来像这样:
    UserBundle
    ├── Controller
    │   ├── Admin
    │   │   └── UserController.php
    │   └── UserController.php
    ├── Resources
    │   └── views
    │       ├── Admin
    │       │   └── User
    │       │       ├── add.html.twig
    │       │       ├── delete.html.twig
    │       │       ├── edit.html.twig
    │       │       ├── form.html.twig
    │       │       └── index.html.twig
    │       └── User
    │           ├── edit.html.twig
    │           ├── sign-in.html.twig
    │           ├── sign-up.html.twig
    │           └── view.html.twig
    └── UserBundle.php
    
    二、我有CommonBundle我将其用于多个 bundle 共享的内容:
    CommonBundle
    ├── Resources
    │   ├── public
    │   │   ├── css
    │   │   │   ├── admin.css
    │   │   │   ├── common.css
    │   │   │   └── public.css
    │   │   └── img
    │   │       ├── add.png
    │   │       ├── delete.png
    │   │       ├── edit.png
    │   │       ├── error.png
    │   │       ├── return.png
    │   │       ├── success.png
    │   │       └── upload.png
    │   └── views
    │       ├── Admin
    │       │   └── layout.html.twig
    │       └── layout.html.twig
    └── CommonBundle.php
    
    我的 app/Resources/views/base.html.twig几乎与 Symfony 标准发行版相同:
    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8" />
            <title>{{ block('title') | striptags | raw }}</title>
            {% block stylesheets %}{% endblock %}
        </head>
        <body>
            {% block body %}{% endblock %}
            {% block javascripts %}{% endblock %}
        </body>
    </html>
    
    两者 CommonBundle/Resources/views/layout.htmlCommonBundle/Resources/views/Admin/layout.html延长 app/Resources/views/base.html.twig .其他包的模板扩展了这两种布局之一,具体取决于它们是用于前端还是后端。基本上,这就是我使用 Three-level Inheritance approach 的方式.
    所以,我会把你的日期显示放入 CommonBundle .根据其复杂性,它可能只是一个模板,一个 macroTwig extension .
    分页是一个常见的问题,所以我建议你使用 existing 之一bundles而不是重新发明轮子——当然,如果它们满足您的需求。
    是的,没有 Controller 或 View 等的包是完全可以的。

    关于php - Symfony2 概念问题 : general bundles vs. 特定问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8012191/

    相关文章:

    Symfony2 LTS : how to upgrade from 2. 3 到 2.7?

    symfony - 如何在 symfony 2.1 表单中添加条件验证

    php - Symfony2 获取位于 security.yml 中的 access_control 参数

    php - 如何访问 Symfony 2 中的 bundle 实例?

    php - 如何在选择 4 个表单字段之一后以交互方式更新 HTML 表

    php - MySQL order by in mongodb findOne()

    PHP Web服务获取json格式的数据

    java - fragment 中传递的 Arraylist 为空

    java - 将 List 放入 Bundle 对象

    php - 连接表的 foreach 循环