编辑:Symfony best practices回答我的大部分问题。
我有几个关于我的 Symfony2 应用程序的问题。
它将有一个前端和一个后端,它们将使用一些通用代码(例如日期显示器、分页器、一些经常使用的模板等)。
因此,我创建了一个 FrontendBundle 和一个 BackendBundle,每个都包含例如它们各自的布局。第一个问题:为前端和后端创建 bundle 的好做法是什至没有 Controller 的“通用” bundle 吗?
第二个问题:我在一本食谱上读到我不应该把我的布局放在包里,而是放在 app/Resources/views/目录中。我已经有一个 base.html.twig 文件,我想知道我是否也应该把我的布局也放在那里,就像一个 frontend_layout.html.twig 文件?
我创建了一个名为 RootBundle 的包,它将包含我的应用程序在前端和后端所需的一切。这是一个好习惯吗?或者我应该为每个提议的功能创建一个专用包,例如 PaginatorBundle、DateDisplayerBundle 等?我有一个“杂项”包,其中包含我不知道放在哪里的所有内容,这听起来很奇怪。你是怎样做的?
最佳答案
新方法
自从我写下这个答案几个月后,我的方法发生了变化,所以我将它与社区分享。这个答案仍然很受欢迎,可以引导新人采用我认为不再是最好的方法。所以...
现在我只有一 特定于应用程序的 bundle ,我称之为 AppBundle
.旧方法存在几个问题,以下是其中一些问题:
我建议使用
CommonBundle
对于过去常见的东西,但这样做你将不得不做很多不必要的重构,将事物移入和移出 CommonBundle
基于以后有多少包会使用那个东西。当我开始编写 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.html
和 CommonBundle/Resources/views/Admin/layout.html
延长 app/Resources/views/base.html.twig
.其他包的模板扩展了这两种布局之一,具体取决于它们是用于前端还是后端。基本上,这就是我使用 Three-level Inheritance approach 的方式.所以,我会把你的日期显示放入
CommonBundle
.根据其复杂性,它可能只是一个模板,一个 macro或 Twig extension .分页是一个常见的问题,所以我建议你使用 existing 之一bundles而不是重新发明轮子——当然,如果它们满足您的需求。
是的,没有 Controller 或 View 等的包是完全可以的。
关于php - Symfony2 概念问题 : general bundles vs. 特定问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8012191/