The Bundle System

Caution

注意

In Symfony versions prior to 4.0, it was recommended to organize your own application code using bundles. This is no longer recommended and bundles should only be used to share code and features between multiple applications.

4.0 より前のバージョンの Symfony では、バンドルを使用して独自のアプリケーション コードを編成することが推奨されていました。これは推奨されなくなりました。バンドルは、複数のアプリケーション間でコードと機能を共有するためにのみ使用する必要があります。

A bundle is similar to a plugin in other software, but even better. The core features of Symfony framework are implemented with bundles (FrameworkBundle, SecurityBundle, DebugBundle, etc.) They are also used to add new features in your application via third-party bundles.

バンドルは他のソフトウェアのプラグインに似ていますが、さらに優れています。 Symfony フレームワークのコア機能は、バンドル (FrameworkBundle、SecurityBundle、DebugBundle など) で実装されています。これらは、サードパーティのバンドルを介してアプリケーションに新しい機能を追加するためにも使用されます。

Bundles used in your applications must be enabled per environment in the config/bundles.php file:

アプリケーションで使用されるバンドルは、config/bundles.php ファイルで環境ごとに有効にする必要があります。
1
2
3
4
5
6
7
8
9
10
11
12
// config/bundles.php
return [
    // 'all' means that the bundle is enabled for any Symfony environment
    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],
    Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true],
    Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle::class => ['all' => true],
    // this bundle is enabled only in 'dev' and 'test', so you can't use it in 'prod'
    Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true],
];

Tip

ヒント

In a default Symfony application that uses Symfony Flex, bundles are enabled/disabled automatically for you when installing/removing them, so you don't need to look at or edit this bundles.php file.

Symfony Flex を使用するデフォルトの Symfony アプリケーションでは、バンドルはインストール/削除時に自動的に有効/無効になるため、この bundles.php ファイルを確認または編集する必要はありません。

Creating a Bundle

This section creates and enables a new bundle to show there are only a few steps required. The new bundle is called AcmeTestBundle, where the Acme portion is an example name that should be replaced by some "vendor" name that represents you or your organization (e.g. AbcTestBundle for some company named Abc).

このセクションでは、新しいバンドルを作成して有効にし、必要な手順がわずかであることを示します。新しいバンドルは AcmeTestBundle と呼ばれます。Acme の部分は examplename であり、あなたまたはあなたの組織を表す「ベンダー」名に置き換える必要があります (例: AbcTestBundle Abc という名前の会社の場合)。

Start by adding creating a new class called AcmeTestBundle:

AcmeTestBundle という名前の新しいクラスを作成することから始めます。
1
2
3
4
5
6
7
8
// src/AcmeTestBundle.php
namespace Acme\TestBundle;

use Symfony\Component\HttpKernel\Bundle\AbstractBundle;

class AcmeTestBundle extends AbstractBundle
{
}

6.1

6.1

The AbstractBundle was introduced in Symfony 6.1.

AbstractBundle は Symfony 6.1 で導入されました。

Caution

注意

If your bundle must be compatible with previous Symfony versions you have to extend from the Bundle instead.

バンドルが以前の Symfony バージョンと互換性がある必要がある場合は、代わりにバンドルから拡張する必要があります。

Tip

ヒント

The name AcmeTestBundle follows the standard Bundle naming conventions. You could also choose to shorten the name of the bundle to simply TestBundle by naming this class TestBundle (and naming the file TestBundle.php).

AcmeTestBundle という名前は、standardBundle 命名規則に従います。このクラスに TestBundle という名前を付ける (およびファイルに TestBundle.php という名前を付ける) ことにより、バンドルの名前を単に TestBundle に短縮することもできます。

This empty class is the only piece you need to create the new bundle. Though commonly empty, this class is powerful and can be used to customize the behavior of the bundle. Now that you've created the bundle, enable it:

この空のクラスは、新しいバンドルを作成するために必要な唯一の要素です。通常は空ですが、このクラスは強力で、バンドルの動作をカスタマイズするために使用できます。バンドルを作成したので、有効にします。
1
2
3
4
5
// config/bundles.php
return [
    // ...
    Acme\TestBundle\AcmeTestBundle::class => ['all' => true],
];

And while it doesn't do anything yet, AcmeTestBundle is now ready to be used.

まだ何もしていませんが、AcmeTestBundle を使用する準備が整いました。

Bundle Directory Structure

The directory structure of a bundle is meant to help to keep code consistent between all Symfony bundles. It follows a set of conventions, but is flexible to be adjusted if needed:

バンドルのディレクトリ構造は、すべての Symfony バンドル間でコードの一貫性を維持するのに役立つことを意図しています。一連の規則に従いますが、必要に応じて柔軟に調整できます。
src/
Contains all PHP classes related to the bundle logic (e.g. Controller/RandomController.php).
バンドル ロジックに関連するすべての PHP クラスが含まれます (例: Controller/RandomController.php)。
config/
Houses configuration, including routing configuration (e.g. routing.yaml).
ルーティング構成を含むハウス構成 (例: routing.yaml)。
templates/
Holds templates organized by controller name (e.g. random/index.html.twig).
コントローラー名で整理されたテンプレートを保持します (例: random/index.html.twig)。
translations/
Holds translations organized by domain and locale (e.g. AcmeTestBundle.en.xlf).
ドメインとロケールごとに整理された翻訳を保持します (例: AcmeTestBundle.en.xlf)。
public/
Contains web assets (images, stylesheets, etc) and is copied or symbolically linked into the project public/ directory via the assets:install console command.
Web アセット (画像、スタイルシートなど) を含み、assets:install console コマンドを介してプロジェクトの public/ ディレクトリにコピーまたはシンボリック リンクされます。
assets/
Contains JavaScript, CSS, images and other assets related to the bundle that are not in public/ (e.g. stimulus controllers)
public/ にないバンドルに関連する JavaScript、CSS、画像、およびその他のアセットが含まれています (刺激コントローラーなど)。
tests/
Holds all tests for the bundle.
バンドルのすべてのテストを保持します。

Caution

注意

The recommended bundle structure was changed in Symfony 5, read the Symfony 4.4 bundle documentation for information about the old structure.

推奨されるバンドル構造は Symfony 5 で変更されました。古い構造については、Symfony 4.4 バンドルのドキュメントを参照してください。

When using the new AbstractBundle class, the bundle defaults to the new structure. Override the Bundle::getPath() method to change to the old structure:

新しい AbstractBundle クラスを使用する場合、バンドルはデフォルトで新しい構造になります。 Bundle::getPath() メソッドをオーバーライドして、古い構造に変更します。
1
2
3
4
5
6
7
class AcmeTestBundle extends AbstractBundle
{
    public function getPath(): string
    {
        return __DIR__;
    }
}

Tip

ヒント

It's recommended to use the PSR-4 autoload standard: use the namespace as key, and the location of the bundle's main class (relative to composer.json) as value. As the main class is located in the src/ directory of the bundle:

PSR-4 autoload 標準を使用することをお勧めします。名前空間をキーとして使用し、バンドルのメイン クラスの場所 (composer.json からの相対位置) を値として使用します。メインクラスはバンドルの src/ ディレクトリにあるため:
1
2
3
4
5
6
7
8
9
10
11
12
{
    "autoload": {
        "psr-4": {
            "Acme\\TestBundle\\": "src/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "Acme\\TestBundle\\Tests\\": "tests/"
        }
    }
}

Learn more