Size: a a a

2020 March 29

Д

Дмитрий in Yii Framework 3
Alexander Makarov
Переслано от Dmitriy S
Смотри, есть типовые задачи, которые должен решать форматтер.
1. В приложении три группы роутов. В каждой группе данные должны выводиться в своем формате.
2. Автоматическое форматирования контента по заголовку или параметру риквеста.
3. Работа с сырыми данными. Допустим ты хочешь все обернуть в следующий формат {"status": "success", "data" : {"name" : "Vasya"}}, при этом экшин контроллера у тебя возвращает массив ["name" => "Vasya"]. Обернуть нужно во всех роутах группы.
4. На группу выставлен один формат, допустим xml, один роут из группы нужно вывести в json
Если сможешь как минимум решить эти кейсы, то можно будет рассмотреть твой вариант.
А общие рассуждения пока не интересуют, сделаешь - покажешь.
1. Это хотел решать через Route::parameters()
2. Форматирование чего?
3. Над этим не думал даже, но это в 100% лишняя завязка, вот почему:

есть rpc протокол, где мы отправляем практически всегда следующие ответы:
{id: 1, result: {...}, error: null}
всё, что мы возвращаем из экшенов летим в result.
как быть, если хотим менять id? а если error? пишем кастомные обработчики этих моментов с еще раз кастомным Response? ну такое.
хочешь стандартизировать формат ответа, используй объект, который делает эту работу.

о чем я: если нужно всегда делать {id: 1, result: {...}, error: null}, тогда делаем в контроллере
return RPCResponseObject($data, $id, $error); - это явно и понятно. опять же, если это делать в каждом экшене, то это будет система, а нам нужно избегать систематических лишний действие - оборачивает в middleware и всегда возвращаем из контроллера массив с максимум 3 элементами
return [$data, $id, $error];
Как правильно обернуть это, чтобы дальше конвертить в Response нужно обдумать.
источник

Д

Дмитрий in Yii Framework 3
ну, это имхо)
источник

DS

Dmitriy S in Yii Framework 3
Дмитрий
ну, это имхо)
Middleware как раз и предназначены для "систематической работы". Кроме оборачивания, в ответе может присутствовать одинаковая часть для всех роутов или группы, допустим настройки, как бывает в спа передают. Это тоже легко прикрепляется в моем решении.
источник

DS

Dmitriy S in Yii Framework 3
Дмитрий
1. Это хотел решать через Route::parameters()
2. Форматирование чего?
3. Над этим не думал даже, но это в 100% лишняя завязка, вот почему:

есть rpc протокол, где мы отправляем практически всегда следующие ответы:
{id: 1, result: {...}, error: null}
всё, что мы возвращаем из экшенов летим в result.
как быть, если хотим менять id? а если error? пишем кастомные обработчики этих моментов с еще раз кастомным Response? ну такое.
хочешь стандартизировать формат ответа, используй объект, который делает эту работу.

о чем я: если нужно всегда делать {id: 1, result: {...}, error: null}, тогда делаем в контроллере
return RPCResponseObject($data, $id, $error); - это явно и понятно. опять же, если это делать в каждом экшене, то это будет система, а нам нужно избегать систематических лишний действие - оборачивает в middleware и всегда возвращаем из контроллера массив с максимум 3 элементами
return [$data, $id, $error];
Как правильно обернуть это, чтобы дальше конвертить в Response нужно обдумать.
пишем кастомные обработчики этих моментов с еще раз кастомным Response?  - ты не разобрался как оно работает, мы можем прозрачно работать с сырыми данными и для этого не надо еще раз ничего сосздавать, работаем с тем же ответом. Сделали $response->getData(), поменяли данные, вернули $response->withData(). Таким образом данные формируются по всему стеку, так как доступны всем мидлтварям, а в стрим они уже преобразуются в эмиттере с помощью форматтера.
источник

DS

Dmitriy S in Yii Framework 3
А еще ты не учитываешь, что основным экшином может быть не метод контроллера, а, например, коллейбл или класс реализующий мидлтварь. Из них ты как сырой массив вернуть собираешься?
источник

AM

Alexander Makarov in Yii Framework 3
Вернуть-то понятно как :) return-ом :)
источник

AM

Alexander Makarov in Yii Framework 3
И обработать понятно где - в callable middleware.
источник

AM

Alexander Makarov in Yii Framework 3
Но да, минусы видны...
источник

DS

Dmitriy S in Yii Framework 3
Alexander Makarov
И обработать понятно где - в callable middleware.
А если мидлтварь?
источник

AM

Alexander Makarov in Yii Framework 3
Умгу, тут начинаются проблемы.
источник

AM

Alexander Makarov in Yii Framework 3
Но, конечно, короткий синтаксис аля return $data подкупает...
источник

DS

Dmitriy S in Yii Framework 3
Route::create('/', SiteIndexAction::class)->name('site/index') и усе, массив ты с нее не вернешь. А с DeferredResponse легко
источник

DS

Dmitriy S in Yii Framework 3
Alexander Makarov
Но, конечно, короткий синтаксис аля return $data подкупает...
Ну а сейчас это длинный?
return $this->responseFactory->createResponse(200, '', $items);
источник

AM

Alexander Makarov in Yii Framework 3
Ну, длиннее :)
источник

DS

Dmitriy S in Yii Framework 3
И там и там одна строка. Я понимаю, если там бы еще куча действий дополнительных было, так нет же)
источник

AM

Alexander Makarov in Yii Framework 3
Ну да, не столь критично
источник

AM

Alexander Makarov in Yii Framework 3
@roxblnfk с тебя тогда эксперимент со стримами, ок?
источник

DS

Dmitriy S in Yii Framework 3
Alexander Makarov
@roxblnfk с тебя тогда эксперимент со стримами, ок?
Можно сразу у меня с ветки со стримом скопировать, все ж не с нуля писать
источник

AM

Alexander Makarov in Yii Framework 3
@xepozz а с тебя как смёржим, перестроить REST чуть, хорошо?
источник

a

artem in Yii Framework 3
Дмитрий
будет на сборка своей редакции. хочешь только апи - делаешь на yii-api
Плюс
источник