View Response listener

The view response listener makes it possible to simply return a View instance from action controllers. The final output will then automatically be processed via the listener by the fos_rest.view_handler service.

This requires adding the SensioFrameworkExtraBundle to your vendors.

Now inside a controller it’s possible to simply return a View instance.

<?php

namespace AppBundle\Controller;

use FOS\RestBundle\View\View;

class UsersController
{
    public function getUsersAction()
    {
        $view = View::create();

        // ...

        $view->setData($data);
        return $view;
    }
}

As this feature is heavily based on the SensioFrameworkExtraBundle, the example can further be simplified by using the various annotations supported by that bundle. There is also one additional annotation called @View() which extends from the @Template() annotation.

Note: SensioFrameworkExtraBundle must be in your kernel if you want to use the annotations and sensio_framework_extra.view.annotations must be set to true.

The @View() and @Template() annotations behave essentially the same with a minor difference. When view_response_listener is set to true instead of force and @View() is not used, then rendering will be delegated to SensioFrameworkExtraBundle (you must enable the view annotations in SensioFrameworkExtraBundle for that case, use the default configuration).

<?php

namespace AppBundle\Controller;

use FOS\RestBundle\Controller\Annotations\View;

class UsersController
{
    /**
     * @View()
     */
    public function getUsersAction()
    {
        // ...

        return $data;
    }
}

The status code of the view can also be configured:

<?php

/**
 * @View(statusCode=204)
 */
public function deleteUserAction()
{
    // ...
}

The groups for the serializer can be configured as follows:

<?php

/**
 * @View(serializerGroups={"group1", "group2"})
 */
public function getUsersAction()
{
    // ...
}

Enabling the MaxDepth exclusion strategy support for the serializer can be configured as follows:

<?php

/**
 * @View(serializerEnableMaxDepthChecks=true)
 */
public function getUsersAction()
{
    // ...
}

You can also define your serializer options dynamically:

<?php

use FOS\RestBundle\Controller\Annotations\View as ViewAnnotation;
use FOS\RestBundle\View\View;
use FOS\RestBundle\Context\Context;

/**
 * @ViewAnnotation()
 */
public function getUsersAction()
{
    $view = View::create();

    $context = new Context();
    $context->setVersion('1.0');
    $context->addGroup('user');

    $view->setContext($context);

    // ...
    $view
        ->setData($data)
    ;
    return $view;
}