新しいリクエストのフォーマットとマイムタイプの登録方法

全ての Request は “format”(例えば、 htmljson) を持っており、 Response で返す内容のタイプを決定するのに使われます。実際にリクエストフォーマットは、:method:Symfony\Component\HttpFoundation\Request::getRequestFormat メソッドを介して Response オブジェクトの Content-Type ヘッダのマイムタイプをセットするのに使われます。内部的には、 Symfony は htmljson などの一般的なフォーマットのマップを持っており、それぞれ対応するマイムタイプ text/htmlapplication/json に結び付けられます。もちろん、フォーマットとマイムタイプのエントリも簡単に追加することができます。この記事では、 jsonp フォーマットとそれに対応するマイムタイプの追加方法を説明します。

kernel.request リスナを作成する

新しいマイムタイプの定義するキーは、 Symfony カーネルによってディスパッチされる kernel.request イベントを “listen” するクラスを作成することです。 kernel.request イベントは、 Symfony のリクエスト処理の初期でディスパッチされるので、リクエストオブジェクトを変更することができるのです。

次のクラスを作成し、あなたのプロジェクトのバンドルのパスに入れ替えてください。

// src/Acme/DemoBundle/RequestListener.php
namespace Acme\DemoBundle;

use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;

class RequestListener
{
    public function onKernelRequest(GetResponseEvent $event)
    {
        $event->getRequest()->setFormat('jsonp', 'application/javascript');
    }
}

リスナを登録する

他のリスナのように、 kernel.event_listener タグを追加して、コンフィギュレーションファイルにリスナとして追加、登録する必要があります。

  • XML
    <!-- app/config/config.xml -->
    <?xml version="1.0" ?>
    
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
    
        <service id="acme.demobundle.listener.request" class="Acme\DemoBundle\RequestListener">
            <tag name="kernel.event_listener" event="kernel.request" method="onKernelRequest" />
        </service>
    
    </container>
    
  • YAML
    # app/config/config.yml
    services:
        acme.demobundle.listener.request:
            class: Acme\DemoBundle\RequestListener
            tags:
                - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
    
  • PHP
    # app/config/config.php
    $definition = new Definition('Acme\DemoBundle\RequestListener');
    $definition->addTag('kernel.event_listener', array('event' => 'kernel.request', 'method' => 'onKernelRequest'));
    $container->setDefinition('acme.demobundle.listener.request', $definition);
    

これで、 acme.demobundle.listener.request サービスが設定されているので、 Symfony のカーネルが kernel.request イベントをディスパッチする際に通知されます。

Tip

コンフィギュレーション拡張クラスでリスナを定義することもできます。詳細は、 コンテナエクステンションでコンフィギュレーションをインポートする を参照してください。