2

JSON と HTML の両方の応答を提供するアプリに取り組んでいます。アクション メソッドの例を次に示します。

/**
 * Lists all Boards entities.
 *
 * @Route("/", name="boards")
 * @Method("GET")
 * @Template()
 */
public function indexAction()
{
    $em = $this->getDoctrine()->getManager();

    $entities = $em->getRepository('ScrumBoardServiceBundle:Boards')->findAll();

    $acceptHeader = strtolower($this->getRequest()->headers->get('Accept'));
    if ($acceptHeader === 'application/json') {
        $serializer = new Serializer(array(new GetSetMethodNormalizer()), array('json' => new
                JsonEncoder()));
        $response = $serializer->serialize(array('success' => true, 'data' => array(
                'entity' => $entities,
        )), 'json');
        $result = new Response($response, 200, array('Content-Type' => 'application/json'));
    } else {
        $result = array(
            'entities' => $entities,
        );
    }

    return $result;
}

これはうまくいきます。正確 にである HTTP Accept ヘッダーを送信するapplication/jsonと、JSON が返されます。それ以外の場合は、通常の hTML ビューが表示されます。

これはうまくいきますが、何十ものアクションがあります。私はむしろ自分自身を繰り返したくありません。私はこのコードをもう少し一般的なものにリファクタリングすることに取り組んでいます...しかし、この問題が既存の Symfony2 バンドルによってすでに解決されているかどうかも疑問に思っています。多分注釈付きの何か?それともコンフィグ設定?私はこれまで何も見つけることができませんでした。しかし、私は Symfony を初めて使用するので、簡単に何かを見落としている可能性があります。

4

2 に答える 2

2

一般的な考え方として、サードパーティのバンドルの使用を避けたい場合は、kernel.response イベントにサブスクライブして、1 つの共通の場所で Response を操作できます。

何かのようなもの:

//services.yml

services:
  my.kernel.listener:
    class: Acme\Bundle\AppBundle\EventListener\MyKernelListener
    tags:
      - { name: kernel.event_listener, event: kernel.response, method: onKernelResponse }

// MyKernelListener.php

class MyKernelListener
{
    public function onKernelResponse(FilterResponseEvent $event)
    {
        $response = $event->getResponse();
        $request = $event->getRequest();
        // ... your logic ...
    }
}
于 2014-03-08T22:53:59.743 に答える
1

探しているバンドルはFOSRestBundleです。

Acceptヘッダーに基づいてJSONを提供するか、ルートに_formatを追加することができます...高度に構成可能です。

JMSSerializerBundleとうまく連携します。

于 2013-05-23T01:18:57.690 に答える