Understanding how the Front Controller, Kernel and Environments Work together

The configuration environments section explained the basics on how Symfony uses environments to run your application with different configuration settings. This section will explain a bit more in-depth what happens when your application is bootstrapped. To hook into this process, you need to understand three parts that work together:

構成環境セクションでは、Symfony が環境を使用してさまざまな構成設定でアプリケーションを実行する方法の基本を説明しました。このセクションでは、アプリケーションがブートストラップされたときに何が起こるかをもう少し詳しく説明します。このプロセスを理解するには、次の 3 つの部分が連携して機能することを理解する必要があります。

Note

ノート

Usually, you will not need to define your own front controller or Kernel class as Symfony provides sensible default implementations. This article is provided to explain what is going on behind the scenes.

通常、Symfony は適切なデフォルト実装を提供するため、独自のフロント コントローラーまたはカーネル クラスを定義する必要はありません。この記事は、舞台裏で何が起こっているかを説明するために提供されています。

The Front Controller

The front controller is a design pattern; it is a section of code that all requests served by an application run through.

フロントコントローラーはデザインパターンです。これは、アプリケーションによって提供されるすべての要求が実行されるコードのセクションです。

In the Symfony Skeleton, this role is taken by the index.php file in the public/ directory. This is the very first PHP script that is run when a request is processed.

Symfony Skeleton では、この役割は public/ ディレクトリ内の index.php ファイルによって担われます。これは、request の処理時に実行される最初の PHP スクリプトです。

The main purpose of the front controller is to create an instance of the Kernel (more on that in a second), make it handle the request and return the resulting response to the browser.

フロント コントローラーの主な目的は、カーネルのインスタンスを作成し (これについては後で詳しく説明します)、要求を処理させ、結果の応答をブラウザーに返すことです。

Because every request is routed through it, the front controller can be used to perform global initialization prior to setting up the kernel or to decorate the kernel with additional features. Examples include:

すべてのリクエストがそれを介してルーティングされるため、フロント コントローラーを使用して、カーネルをセットアップする前にグローバルな初期化を実行したり、追加機能でカーネルを装飾したりできます。例は次のとおりです。
  • Configuring the autoloader or adding additional autoloading mechanisms;
    オートローダの構成または追加のオートローディング メカニズムの追加。
  • Adding HTTP level caching by wrapping the kernel with an instance of HttpCache;
    カーネルを HttpCache のインスタンスでラップすることにより、HTTP レベルのキャッシュを追加します。
  • Enabling the Debug component.
    デバッグ コンポーネントを有効にします。

You can choose the front controller that's used by adding it in the URL, like:

次のように URL に追加することで、使用するフロント コントローラーを選択できます。
1
http://localhost/index.php/some/path/...

As you can see, this URL contains the PHP script to be used as the front controller. You can use that to switch to a custom made front controller that is located in the public/ directory.

ご覧のとおり、この URL には、フロントコントローラーとして使用される PHP スクリプトが含まれています。これを使用して、 public/ ディレクトリにあるカスタムメイドのフロントコントローラーに切り替えることができます。

See also

こちらもご覧ください

You almost never want to show the front controller in the URL. This is achieved by configuring the web server, as shown in Configuring a Web Server.

URL にフロント コントローラーを表示することはほとんどありません。これは、Web サーバーの構成に示されているように、Web サーバーを構成することによって実現されます。

Technically, the bin/console script used when running Symfony on the command line is also a front controller, only that is not used for web, but for command line requests.

技術的には、コマンドラインで Symfony を実行するときに使用される bin/console スクリプトはフロント コントローラーでもありますが、これは Web ではなくコマンドライン リクエストに使用されます。

The Kernel Class

The Kernel is the core of Symfony. It is responsible for setting up all the bundles used by your application and providing them with the application's configuration. It then creates the service container before serving requests in its handle() method.

カーネルは Symfony のコアです。アプリケーションで使用されるすべてのバンドルをセットアップし、それらにアプリケーションの構成を提供します。次に、handle() メソッドでリクエストを処理する前に、サービス コンテナを作成します。

The kernel used in Symfony applications extends from Kernel and uses the MicroKernelTrait. The Kernel class leaves some methods from KernelInterface unimplemented and the MicroKernelTrait defines several abstract methods, so you must implement them all:

Symfony アプリケーションで使用されるカーネルは、Kerneland から拡張され、MicroKernelTrait を使用します。Kernel クラスは、KernelInterface からのいくつかのメソッドを未実装のままにし、MicroKernelTrait はいくつかの抽象メソッドを定義するため、それらすべてを実装する必要があります。
registerBundles()
It must return an array of all bundles needed to run the application.
アプリケーションの実行に必要なすべてのバンドルの配列を返す必要があります。
configureRoutes()
It adds individual routes or collections of routes to the application (for example loading the routes defined in some config file).
個々のルートまたはルートのコレクションをアプリケーションに追加します (たとえば、構成ファイルで定義されたルートをロードします)。
configureContainer()
It loads the application configuration from config files or using the loadFromExtension() method and can also register new container parameters and services.
構成ファイルから、または loadFromExtension() メソッドを使用してアプリケーション構成をロードし、新しいコンテナ パラメータとサービスを登録することもできます。

To fill these (small) blanks, your application needs to extend the Kernel class and use the MicroKernelTrait to implement these methods. Symfony provides by default that kernel in the src/Kernel.php file.

これらの (小さな) 空白を埋めるには、アプリケーションで Kernel クラスを拡張し、MicroKernelTrait を使用してこれらのメソッドを実装する必要があります。 Symfony はデフォルトで src/Kernel.php ファイルにそのカーネルを提供します。

This class uses the name of the environment - which is passed to the Kernel's constructor method and is available via getEnvironment() - to decide which bundles to enable. The logic for that is in registerBundles().

このクラスは、環境の名前 (カーネルのコンストラクター メソッドに渡され、getEnvironment() を介して使用可能) を使用して、どのバンドルを有効にするかを決定します。そのためのロジックは registerBundles() にあります。

You are free to create your own, alternative or additional Kernel variants. All you need is to adapt your (or add a new) front controller to make use of the new kernel.

独自の、代替の、または追加のカーネル バリアントを自由に作成できます。必要なのは、新しいカーネルを利用するためにフロント コントローラーを適応させる (または新しいコントローラーを追加する) ことだけです。

Note

ノート

The name and location of the Kernel is not fixed. When putting multiple kernels into a single application, it might therefore make sense to add additional sub-directories, for example src/admin/AdminKernel.php and src/api/ApiKernel.php. All that matters is that your front controller is able to create an instance of the appropriate kernel.

カーネルの名前と場所は固定されていません。したがって、複数のカーネルを 1 つのアプリケーションに配置する場合は、rc/admin/AdminKernel.php や src/api/ApiKernel.php などのサブディレクトリを追加することをお勧めします。重要なのは、フロント コントローラーが適切なカーネルのインスタンスを作成できることだけです。

Note

ノート

There's a lot more the Kernel can be used for, for example overriding the default directory structure. But odds are high that you don't need to change things like this on the fly by having several Kernel implementations.

たとえば、デフォルトのディレクトリ構造をオーバーライドするなど、カーネルを使用できることは他にもたくさんあります。

Debug Mode

The second argument to the Kernel constructor specifies if the application should run in "debug mode". Regardless of the configuration environment, a Symfony application can be run with debug mode set to true or false.

Kernel コンストラクターの 2 番目の引数は、アプリケーションを「デバッグ モード」で実行するかどうかを指定します。構成環境に関係なく、Symfony アプリケーションはデバッグモードを true または false に設定して実行できます。

This affects many things in the application, such as displaying stack traces on error pages or if cache files are dynamically rebuilt on each request. Though not a requirement, debug mode is generally set to true for the dev and test environments and false for the prod environment.

これは、エラー ページでのスタック トレースの表示や、リクエストごとにキャッシュ ファイルが動的に再構築されるかどうかなど、アプリケーションの多くのことに影響します。必須ではありませんが、通常、デバッグ モードは開発環境とテスト環境では true に設定され、本番環境では false に設定されます。

Similar to configuring the environment you can also enable/disable the debug mode using the .env file:

環境の構成と同様に、.env ファイルを使用してデバッグ モードを有効/無効にすることもできます。
1
2
3
# .env
# set it to 1 to enable the debug mode
APP_DEBUG=0

This value can be overridden for commands by passing the APP_DEBUG value before running them:

この値は、コマンドを実行する前に APP_DEBUG 値を渡すことでコマンドに対して上書きできます。
1
2
3
4
5
# Use the debug mode defined in the .env file
$ php bin/console command_name

# Ignore the .env file and enable the debug mode for this command
$ APP_DEBUG=1 php bin/console command_name

Internally, the value of the debug mode becomes the kernel.debug parameter used inside the service container. If you look inside the application configuration file, you'll see the parameter used, for example, to turn Twig's debug mode on:

内部的には、デバッグ モードの値は、サービス コンテナー内で使用される kernel.debug パラメーターになります。アプリケーション構成ファイル内を見ると、たとえば、Twig のデバッグ モードをオンにするためにパラメーターが使用されていることがわかります。
  • YAML
    YAML
  • XML
    XML
  • PHP
    PHP
1
2
3
# config/packages/twig.yaml
twig:
    debug: '%kernel.debug%'

The Environments

As mentioned above, the Kernel has to implement another method - configureContainer(). This method is responsible for loading the application's configuration from the right environment.

前述のように、カーネルは別のメソッド -configureContainer() を実装する必要があります。このメソッドは、適切な環境からアプリケーションの構成をロードする役割を果たします。

Configuration environments allow to execute the same code using different configuration. Symfony provides three environments by default called dev, prod and test.

構成環境では、異なる構成を使用して同じコードを実行できます。 Symfony は、デフォルトで dev、prod、および test と呼ばれる 3 つの環境を提供します。

More technically, these names are nothing more than strings passed from the front controller to the Kernel's constructor. This name can then be used in the configureContainer() method to decide which configuration files to load.

より技術的には、これらの名前は、フロント コントローラーからカーネルのコンストラクターに渡される文字列にすぎません。次に、この名前を configureContainer() メソッドで使用して、ロードする構成ファイルを決定できます。

Symfony's default Kernel class implements this method by loading first the config files found on config/packages/* and then, the files found on config/packages/ENVIRONMENT_NAME/. You are free to implement this method differently if you need a more sophisticated way of loading your configuration.

Symfony のデフォルトの Kernel クラスは、最初に config/packages/* にある構成ファイルをロードし、次に config/packages/ENVIRONMENT_NAME/ にあるファイルをロードすることによって、このメソッドを実装します。構成をロードするためのより洗練された方法が必要な場合は、このメソッドを別の方法で自由に実装できます。

Environments and the Cache Directory

Symfony takes advantage of caching in many ways: the application configuration, routing configuration, Twig templates and more are cached to PHP objects stored in files on the filesystem.

symfony は多くの方法でキャッシュを利用します: アプリケーション構成、ルーティング構成、Twig テンプレートなどは、ファイルシステム上のファイルに格納された PHP オブジェクトにキャッシュされます。

By default, these cached files are largely stored in the var/cache/ directory. However, each environment caches its own set of files:

デフォルトでは、これらのキャッシュされたファイルの大部分は var/cache/ ディレクトリに保存されます。ただし、各環境は独自のファイル セットをキャッシュします。
1
2
3
4
5
6
your-project/
├─ var/
│  ├─ cache/
│  │  ├─ dev/   # cache directory for the *dev* environment
│  │  └─ prod/  # cache directory for the *prod* environment
│  ├─ ...

Sometimes, when debugging, it may be helpful to inspect a cached file to understand how something is working. When doing so, remember to look in the directory of the environment you're using (most commonly dev/ while developing and debugging). While it can vary, the var/cache/dev/ directory includes the following:

デバッグ時に、キャッシュされたファイルを調べて、何かがどのように機能しているかを理解すると役立つ場合があります。そうするときは、使用している環境のディレクトリを確認することを忘れないでください (開発およびデバッグ中は、最も一般的には dev/ です)。異なる場合がありますが、var/cache/dev/ ディレクトリには以下が含まれます。
App_KernelDevDebugContainer.php
The cached "service container" that represents the cached application configuration.
キャッシュされたアプリケーション構成を表す、キャッシュされた「サービス コンテナー」。
url_generating_routes.php
The cached routing configuration used when generating URLs.
URL の生成時に使用されるキャッシュされたルーティング構成。
url_matching_routes.php
The cached configuration used for route matching - look here to see the compiled regular expression logic used to match incoming URLs to different routes.
ルート マッチングに使用されるキャッシュされた構成 - ここを参照して、受信 URL をさまざまなルートに一致させるために使用されるコンパイル済みの正規表現ロジックを確認してください。
twig/
This directory contains all the cached Twig templates.
このディレクトリには、キャッシュされたすべての Twig テンプレートが含まれています。

Note

ノート

You can change the cache directory location and name. For more information read the article How to Override Symfony's default Directory Structure.

キャッシュ ディレクトリの場所と名前を変更できます。詳細については、Symfony のデフォルト ディレクトリ構造をオーバーライドする方法の記事を参照してください。