ErrorAction не форматирует вывод

Всё что касается построения API
Ответить
undestroyer
Сообщения: 120
Зарегистрирован: 2014.01.06, 13:46

ErrorAction не форматирует вывод

Сообщение undestroyer »

Простейший контроллер REST. Если обращаться к существующему методу site/echo, то ответ приходит отформатированным.

Если обратиться к несуществующему методу (site/notfound), скрипт обрабатывает ошибку, но не учитывает формат вывода. Пытается отрендерить страницу с ошибкой, но естественно в REST никаких view нет и натыкается на The view file does not exist.

Что я сделал не так?


Код: Выделить всё

<?php
namespace openapi\controllers;

use yii\filters\ContentNegotiator;
use yii\rest\Controller;
use yii\web\Response;


/**
 * Site controller
 */
class SiteController extends Controller
{

    function behaviors()
    {
        return [
            'contentNegotiator' => [
                'class' => ContentNegotiator::className(),
                'formats' => [
                    'application/json' => Response::FORMAT_JSON,
                    'application/xml' => Response::FORMAT_XML,
                ],
            ],
        ];
    }

    /**
     * @inheritdoc
     */
    public function actions()
    {
        return [
            'error' => [
                'class' => 'yii\web\ErrorAction',
            ],
        ];
    }

    public function actionEcho()
    {
        return ['result'=>1];
    }

} 
undestroyer
Сообщения: 120
Зарегистрирован: 2014.01.06, 13:46

Re: ErrorAction не форматирует вывод

Сообщение undestroyer »

Нашел решение (орфография, пунктуация и стилистика оригинала сохранена)
Проблема "невозможности" указать формат ответа у ошибок, которые, к примеру были вызваны вне контроллера и не могут быть "пропущены" через yii\filters\ContentNegotiator имеет место быть, т.к. в сети по этому поводу 0, а в тех болванках, что предназначены для демонстрации возможностей Yii2 в плане REST из коробки, все решение данного вопроса сводилось к тому, чтобы просто явно указать формат ответа в yii\web\Response, что вообще, я считаю, костыль, т.к. весь смысл отдачи ответа в разных форматах сразу продает.

Решение оказалось очень простым, просто нужно внимательно читать документацию к классам, а не бегать глазами по ней. В классе yii\filters\ContentNegotiator черным по белому написано:

Код: Выделить всё

 * The following code shows how you can use ContentNegotiator as a bootstrapping component. Note that in this case,
 * the content negotiation applies to the whole application.
 *
 * ```php
 * // in application configuration
 * use yii\web\Response;
 *
 * return [
 *     'bootstrap' => [
 *         [
 *             'class' => 'yii\filters\ContentNegotiator',
 *             'formats' => [
 *                 'application/json' => Response::FORMAT_JSON,
 *                 'application/xml' => Response::FORMAT_XML,
 *             ],
 *             'languages' => [
 *                 'en',
 *                 'de',
 *             ],
 *         ],
 *     ],
 * ];
 * ```
 
, что в переводе: "если тебе, парниш, нужен ровный, пацанский REST - пихай меня в boostrap своего приложения, и все будет шикарно". Именно так, нам и нужно сделать, но перед этим не забудьте убрать ContentNegotiator из списка поведений в контроллере.
Источник http://mihaly4.ru/blog/yii2/post/yii2-r ... rorhandler
Ответить