<Mr.ElectroNick>
/* personal website */

Как вернуть JSON из контроллера в Zend2 (ZF2)

Новый слой представлений в Zend Framework можно заставить возвращать JSON вместо отрендереного HTML довольно просто. Это можно сделать двумя путями:

Настройка JsonStrategy

Для начала нам нужно настроить JsonStrategy чтобы с ее помощью при необходимости возвращать JSON из экшена контроллера. JsonStrategy контроллируя возвращаемые данные из экшенов контроллеров вызовет рендер JsonRenderer в следующих ситуациях:

  • Модель представления возвращенная из экшена имеет тип JsonModel
  • HTTP заголовок «Accept header» получен от браузера и содержит «application/json«

Для включения JsonStrategy нам нужно добавить «ViewJsonStrategy» в массив «strategies» конфигурационного файла модуля:

module/Application/config/module.config.php:

    'view_manager' => array(
        'display_not_found_reason' => true,
        'display_exceptions'       => true,
        'doctype'                  => 'HTML5',
        'not_found_template'       => 'error/404',
        'exception_template'       => 'error/index',
        'template_map' => array(
            'layout/layout' => __DIR__ . '/../view/layout/layout.phtml',
            'index/index'   => __DIR__ . '/../view/index/index.phtml',
            'error/404'     => __DIR__ . '/../view/error/404.phtml',
            'error/index'   => __DIR__ . '/../view/error/index.phtml',
        ),
        'template_path_stack' => array(
            'application' => __DIR__ . '/../view',
        ),		
        'strategies' => array(
            'ViewJsonStrategy',
        ),		
    ),

Возвращаем JsonModel из экшена контроллера

Чтобы вернуть JSON в ответ на запрос в заголовке «Accept» которого не установлено значение «application/json» мы используем JsonModel в экшене контроллера следующим образом:

module/Application/src/Application/Controller/IndexController.php:

namespace Application\Controller;

use Zend\Mvc\Controller\ActionController;
use Zend\View\Model\ViewModel;
use Zend\View\Model\JsonModel;

class IndexController extends ActionController
{
    public function indexAction()
    {
        $result = new JsonModel(array(
	    'some_parameter' => 'some value',
            'success'=>true,
        ));

        return $result;
    }
}

В результате вместо HTML мы получим JSON. Если вы вызываете экшен через ajax с установленым заголовком «Accept: application/json» то можно использовать ViewModel как обычно.