Как вернуть 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
как обычно.