bundle 系统

大多数流行的框架和平台都支持某种形式的模块、插件、扩展或 bundles。在大多数时候,两者的区别其实只是在命名上,而可扩展性和模块化的概念是一样的。在 Symfony 中,这些模块化模块被称为 bundles。

bundles 是 Symfony 中的一等公民,因为它们支持其他组件的所有操作。Symfony 中的所有东西都是一个bundle,甚至是核心框架。bundles 使我们能够构建模块化的应用程序,而一个特定功能的全部代码都包含在一个目录中。

一个bundle 将所有的PHP文件,模板,样式表,JavaScript文件,测试和其他任何东西都放在一个根目录中。

当我们第一次设置测试应用程序时,它为我们创建了一个AppBundle,在src目录下。随着我们推进自动生成的CRUD,我们看到我们的 bundle 得到了各种各样的目录和文件。

要想让一个 bundle 被 Symfony 注意到,需要将它添加到app/AppKernel.php文件中,使用registerBundles方法,如图所示:

  1. public function registerBundles()
  2. {
  3. $bundles = [
  4. new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
  5. new Symfony\Bundle\SecurityBundle\SecurityBundle(),
  6. new Symfony\Bundle\TwigBundle\TwigBundle(),
  7. new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(),
  8. new Doctrine\Bundle\DoctrineBundle\DoctrineBundle(),
  9. //…
  10. new AppBundle\AppBundle(),
  11. ];
  12. //…
  13. return $bundles;
  14. }

创建一个新的 bundle 就像创建一个PHP文件一样简单。让我们继续创建一个src/TestBundle/TestBundle.php文件,内容如下:

  1. namespace TestBundle;
  2. use Symfony\Component\HttpKernel\Bundle\Bundle;
  3. class TestBundle extends Bundle
  4. {
  5. }

一旦文件到位,我们需要做的就是通过app/AppKernel.php文件的registerBundles方法进行注册,如图所示:

  1. class AppKernel extends Kernel {
  2. //…
  3. public function registerBundles() {
  4. $bundles = [
  5. // …
  6. new TestBundle\TestBundle(),
  7. // …
  8. ];
  9. return $bundles;
  10. }
  11. //…
  12. }

创建一个 bundle 的更简单的方法是运行一个控制台命令,如下所示:

  1. php bin/console generate:bundle --namespace=Foggyline/TestBundle

这将会触发一系列关于 bundle 的问题,最终导致 bundle 的创建,看起来像下面的截图:

bundle 系统 - 图1

一旦完成这个过程,就会创建一个包含多个目录和文件的新 bundle,如下图所示:

bundle 系统 - 图2

Bundle 生成器很友好地创建了控制器、依赖注入扩展、路由、准备服务配置、模板,甚至测试。由于我们选择共享我们的 bundle,Symfony 选择了 XML 作为默认的配置格式。依赖扩展简单来说就是我们可以通过使用 foggyline_test作为 Symfony 主 config.yml的根元素来访问我们的 bundle 配置。实际的foggyline_test元素是在DependencyInjection/Configuration.php文件中定义的。