KernelとHttpKernel、その辺の起動順序

Symfony2で名前的に混乱しやすそうなのがKernelとHttpKernelで、

  • Kernelはアプリケーション全体のベースとなる
  • HttpKernelは1つのHTTPリクエストのベースとなる

という感じで、Kernelの方がベースよりです。これは説明するまでもないかもしれませんが、フロントコントローラーで一番最初に作られるAppKernelがKernelの方を継承しています。

で、ポイントはHttpKernelの初期化のあたりですが、これはDIコンテナ経由で行われます。
(※DIコンテナ自身はKernelが作ります)
Kernel::handle()内部で、

<?php
return $this->container->getHttpKernelService()->handle($request, $type, $raw);

とコンテナ経由でHttpKernelサービスにアクセスしているので、この時点でHttpKernelが初期化されます。

DIコンテナの面白い(すごい)のはここからなんですが、このHttpKernelを初期化する際に、同時にいくつかの他のサービスも初期化されます。なぜかというと、DIの定義で、HttpKernelのコンストラクタにいくつかのパラメーターが渡されていて、このパラメーターはDIが渡すのですが、そのパラメーターがまだ初期化されていなければ、それもまたその時点でインスタンス化されるからです。
具体的には、HttpKernelのコンストラクタには次の3つの引数があります。

  • ContainerInterface $container
  • EventDispatcher $dispatcher
  • ControllerResolverInterface $resolver

対応するDIの定義は、FrameworkBundleのservices.xmlにあります。

<service id="http_kernel" class="%http_kernel.class%">
    <argument type="service" id="service_container" />
    <argument type="service" id="event_dispatcher" />
    <argument type="service" id="controller_resolver" />
</service>

なので、HttpKernelがインスタンス化されると同時に、DIコンテナによってEventDispatcherがインスタンス化されます。


symfony 1的に「new EventDispatcher」でgrepしたりしても見つかりませんw
このあたりに慣れるまでは、ちょっとソースを追うのが大変かもしれません。