VerbFilter и REST

Всё что касается построения API
Ответить
Аватара пользователя
mutogen
Сообщения: 52
Зарегистрирован: 2013.10.16, 15:39

VerbFilter и REST

Сообщение mutogen »

Столкнулся с таким вопросом:
В примере приложения в SiteController есть кусок:

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

public function behaviors()
    {
        return [
            ...
            'verbs' => [
                'class' => VerbFilter::className(),
                'actions' => [
                    'logout' => ['post'],
                ],
            ],
        ];
    }
Здесь задается допустимый http метод для запроса. Можно ли аналогичное делать и в случае REST-контроллера?
Попытка сделать один-в-один как тут приводит к тому, что ответ перестает оборачиваться в нужный формат (в моем случае json) и возвращается массив, что валит приложение

В гайде есть вариант с настройкой urlManager

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

[
    'PUT,PATCH users/<id>' => 'user/update',
    'DELETE users/<id>' => 'user/delete',
    'GET,HEAD users/<id>' => 'user/view',
    'POST users' => 'user/create',
    'GET,HEAD users' => 'user/index',
    'users/<id>' => 'user/options',
    'users' => 'user/options',
]
Но тогда как будут обрабатываться ошибки запросов неверными методами (хочется 405-ую давать)
В исходнике \yii\rest\Controller уже дается фильтр в таком виде

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

'verbFilter' => [
                'class' => VerbFilter::className(),
                'actions' => $this->verbs(),
            ],
Но по умолчанию $this->verds() это просто:

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

protected function verbs()
    {
        return [];
    }
Как же тут быть и сделать все правильно и красиво?
lancedevnull
Сообщения: 1268
Зарегистрирован: 2013.07.17, 17:37

Re: VerbFilter и REST

Сообщение lancedevnull »

чтото вы не то говорите, вербс никак не могут повлиять на формат вывода
Аватара пользователя
mutogen
Сообщения: 52
Зарегистрирован: 2013.10.16, 15:39

Re: VerbFilter и REST

Сообщение mutogen »

lancedevnull писал(а):чтото вы не то говорите, вербс никак не могут повлиять на формат вывода
Пардон, моя вина.
Затирал все behaviors в своих rest контроллерах, а надо было делать так:

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

public function behaviors()
    {

        return ArrayHelper::merge(parent::behaviors(), [
                'verbs' => [
                    'class' => VerbFilter::className(),
                    'actions' => [
                        ....
                    ],
                ],
            ]);
    } 
Вопрос отпал
Ответить