Skip to content

Latest commit

 

History

History
123 lines (88 loc) · 4.64 KB

bundles.rst

File metadata and controls

123 lines (88 loc) · 4.64 KB
.. index::
   single: Bundles

Bundle

Caution!

在4.0之前的Symfony版本中,建议使用bundle来组织你自己的应用代码。 现在不再推荐此选项,bundle只应该用来在多个应用之间共享代码和功能。

bundle类似于其他软件中的插件,但却更好。 Symfony框架的核心功能是使用bundle(FrameworkBundle,SecurityBundle,DebugBundle等)实现的。 它们还用于通过 第三方bundle 在应用中添加新功能。

在应用中使用bundel,必须在 config/bundles.php 文件中的每个 :doc:`环境 </configuration/environments>` 中启用它:

// config/bundles.php
return [
    // 'all' 意味着该bundle会在任何环境中使用
    Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['all' => true],
    Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true],
    Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true],
    Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true],
    Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle::class => ['all' => true],
    Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true],
    Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle::class => ['all' => true],
    // 该bundle在 'dev' 和 'test' 环境下启用, 所以你无法再 'prod' 环境下使用它
    Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true],
];

Tip

在使用 :doc:`Symfony Flex </setup/flex>` 的默认的Symfony应用中, 在安装/删除bundle时会自动启用/禁用它们,因此你无需查看或编辑 bundles.php 文件。

创建Bundle

此部分创建并启用新的bundle以显示执行此操作的简单程度。 新的bundle称为 AcmeTestBundle,其中 Acme 部分只是一个虚拟名称, 应该用代表你或你的组织的某个“vendor”名称来替换 (例如某个名为 ABC 的公司的ABCTestBundle)。

首先,创建一个 src/Acme/TestBundle/ 目录并添加一个名为 AcmeTestBundle.php 的新文件:

// src/Acme/TestBundle/AcmeTestBundle.php
namespace App\Acme\TestBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;

class AcmeTestBundle extends Bundle
{
}

Tip

AcmeTestBundle命名遵循标准的 :ref:`Bundle命名约定 <bundles-naming-conventions>`。 你还可以通过命名此类为TestBundle(并命名文件 TestBundle.php)来选择将bundle的名称简化为 TestBundle。

这个空类是创建新bundle所需的唯一部分。 虽然通常为空,但此类功能强大,可用于自定义bundle的行为。 现在你已经创建了bundle,启用它:

// config/bundles.php
return [
    // ...
    App\Acme\TestBundle\AcmeTestBundle::class => ['all' => true],
];

虽然它还没有做任何事情,但现在可以使用AcmeTestBundle了。

Bundle目录结构

bundle的目录结构旨在帮助保持所有Symfony包之间的代码一致。 它遵循一系列约定,但如果需要,也可灵活调整。 看一下AcmeDemoBundle,因为它包含了一些最常见的bundle元素:

Controller/
里面有该bundle的控制器(如 RandomController.php)。
DependencyInjection/
里面有特定的依赖注入扩展类,用来导入服务配置信息,注册compiler passes,以及更多内容(这个目录并非必需)。
Resources/config/
存放配置信息,包括路由配置(如 routing.yaml)。
Resources/views/
存放模板。依控制器名字来组织子文件夹(如 Random/index.html.twig)。
Resources/public/
存放web资源(图片,样式表等),通过console命令 assets:install 以复制或符号链接的方式导入到项目的 public/ 目录。
Tests/
存放bundle的所有测试类。

一个bundle依其实现的功能而或小或大。它只包含你需要的文件,再无其他。

在你通读指南的过程中,你将学到如何持久化对象到数据库中,创建和验证表单,为程序增加翻译功能,编写测试,以及更多内容。 这些中的每一个在bundel中都有自己的位置和角色。

扩展阅读

.. toctree::
    :maxdepth: 1
    :glob:

    bundles/*