Container Building Workflow

The location of the files and classes related to the Dependency Injection component depends on the application, library or framework in which you want to use the container. Looking at how the container is configured and built in the Symfony full-stack Framework will help you see how this all fits together, whether you are using the full-stack framework or looking to use the service container in another application.

依存性注入コンポーネントに関連するファイルとクラスの場所は、コンテナーを使用するアプリケーション、ライブラリ、またはフレームワークによって異なります。コンテナーがどのように構成され、Symfony フルスタック フレームワークに組み込まれているかを見ると、フルスタック フレームワークを使用しているか、別のアプリケーションでサービス コンテナーを使用しようとしているかにかかわらず、これらすべてがどのように適合するかを理解するのに役立ちます。

The full-stack framework uses the HttpKernel component to manage the loading of the service container configuration from the application and bundles and also handles the compilation and caching. Even if you are not using HttpKernel, it should give you an idea of one way of organizing configuration in a modular application.

フルスタック フレームワークは、HttpKernel コンポーネントを使用して、アプリケーションとバンドルからのサービス コンテナー構成の読み込みを管理し、コンパイルとキャッシュも処理します。 HttpKernel を使用していない場合でも、モジュラー アプリケーションで構成を整理する 1 つの方法を理解できるはずです。

Working with a Cached Container

Before building it, the kernel checks to see if a cached version of the container exists. The kernel has a debug setting and if this is false, the cached version is used if it exists. If debug is true then the kernel checks to see if configuration is fresh and if it is, the cached version of the container is used. If not then the container is built from the application-level configuration and the bundles' extension configuration.

コンテナを構築する前に、カーネルはコンテナのキャッシュ バージョンが存在するかどうかを確認します。カーネルにはデバッグ設定があり、これが false の場合、キャッシュされたバージョンが存在する場合はそれが使用されます。 debug が true の場合、カーネルは構成が最新かどうかを確認し、最新の場合はコンテナーのキャッシュ バージョンが使用されます。そうでない場合、コンテナはアプリケーションレベルの設定とバンドルの拡張設定から構築されます。

Read Dumping the Configuration for Performance for more details.

詳細については、パフォーマンスのための構成のダンプを参照してください。

Application-level Configuration

Application level config is loaded from the config directory. Multiple files are loaded which are then merged when the extensions are processed. This allows for different configuration for different environments e.g. dev, prod.

アプリケーション レベルの構成は、構成ディレクトリから読み込まれます。複数のファイルがロードされ、拡張機能が処理されるときにマージされます。これにより、dev、prod などのさまざまな環境に対してさまざまな構成が可能になります。

These files contain parameters and services that are loaded directly into the container as per Setting Up the Container with Configuration Files. They also contain configuration that is processed by extensions as per Managing Configuration with Extensions. These are considered to be bundle configuration since each bundle contains an Extension class.

これらのファイルには、構成ファイルを使用したコンテナーの設定に従ってコンテナーに直接読み込まれるパラメーターとサービスが含まれています。また、拡張機能を使用した構成の管理に従って拡張機能によって処理される構成も含まれています。各バンドルには拡張クラスが含まれているため、これらはバンドル構成と見なされます。

Bundle-level Configuration with Extensions

By convention, each bundle contains an Extension class which is in the bundle's DependencyInjection directory. These are registered with the ContainerBuilder when the kernel is booted. When the ContainerBuilder is compiled, the application-level configuration relevant to the bundle's extension is passed to the Extension which also usually loads its own config file(s), typically from the bundle's Resources/config directory. The application-level config is usually processed with a Configuration object also stored in the bundle's DependencyInjection directory.

慣例により、各バンドルには、バンドルの DependencyInjection ディレクトリにある拡張クラスが含まれています。これらは、カーネルの起動時に ContainerBuilder に登録されます。 ContainerBuilder がコンパイルされると、バンドルの拡張機能に関連するアプリケーション レベルの構成が拡張機能に渡されます。拡張機能は、通常、バンドルの Resources/config ディレクトリから独自の構成ファイルをロードします。アプリケーションレベルの構成は、通常、バンドルの DependencyInjection ディレクトリにも格納されている構成オブジェクトで処理されます。

Compiler Passes to Allow Interaction between Bundles

Compiler passes are used to allow interaction between different bundles as they cannot affect each other's configuration in the extension classes. One of the main uses is to process tagged services, allowing bundles to register services to be picked up by other bundles, such as Monolog loggers, Twig extensions and Data Collectors for the Web Profiler. Compiler passes are usually placed in the bundle's DependencyInjection/Compiler directory.

コンパイラ パスは、拡張クラス内の互いの構成に影響を与えることができないため、異なるバンドル間の相互作用を可能にするために使用されます。主な用途の 1 つは、タグ付けされたサービスを処理することです。これにより、バンドルは、Monolog ロガー、Twig 拡張機能、Web プロファイラーのデータ コレクターなど、他のバンドルによって取得されるサービスを登録できます。コンパイラ パスは通常、バンドルの DependencyInjection/Compiler ディレクトリに配置されます。

Compilation and Caching

After the compilation process has loaded the services from the configuration, extensions and the compiler passes, it is dumped so that the cache can be used next time. The dumped version is then used during subsequent requests as it is more efficient.

コンパイル プロセスが構成、拡張機能、およびコンパイラ パスからサービスをロードした後、次回キャッシュを使用できるようにダンプされます。ダンプされたバージョンは、より効率的であるため、後続のリクエストで使用されます。