Symfony 2.1プロジェクトの場合、配列を返すときにJsonResponseオブジェクトを自動的に作成するリスナーを登録する新しいアノテーション@Json()を作成しようとしています。私はそれを機能させましたが、何らかの理由で、@ Jsonアノテーションがないメソッドでも、リスナーは常に呼び出されます。Sensioエクストラバンドルは@Templateアノテーションを使用してこれを行うため、私のアプローチは機能すると思います。
これが私の注釈コードです。
<?php
namespace Company\Bundle\Annotations;
/**
* @Annotation
*/
class Json extends \Sensio\Bundle\FrameworkExtraBundle\Configuration\ConfigurationAnnotation
{
public function getAliasName()
{
return 'json';
}
}
これが私のリスナーコードです。
<?php
namespace Company\Bundle\Listener\Response\Json;
class JsonListener
{
//..
public function onKernelView(GetResponseForControllerResultEvent $event)
{
$request = $event->getRequest();
$data = $event->getControllerResult();
if(is_array($data) || is_object($data)) {
if ($request->attributes->get('_json')) {
$event->setResponse(new JsonResponse($data));
}
}
}
}
これはリスナーのyaml定義です。
json.listener:
class: Company\Bundle\Listener\Response\Json
arguments: [@service_container]
tags:
- { name: kernel.event_listener, event: kernel.view, method: onKernelView }
kernel.viewリスナーとして登録されているため、明らかにここに何かが欠けています。これを変更して、コントローラーアクションに@Json()アノテーションが存在する場合にのみ呼び出されるようにするにはどうすればよいですか?