Size: a a a

2020 March 29

А

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

А

Алексей R in Yii Framework 3
лить ПР или ветку дать?
источник

AM

Alexander Makarov in Yii Framework 3
artem
Вопрос от обычного юзверя: как я могу сделать инекцию в метод?
Дока есть уже. Yiisoft/docs
источник

DS

Dmitriy S in Yii Framework 3
Алексей R
лить ПР или ветку дать?
Давай ветку пока
источник

AM

Alexander Makarov in Yii Framework 3
Алексей R
лить ПР или ветку дать?
Pr
источник

AM

Alexander Makarov in Yii Framework 3
Dmitriy S
Так что, я перекину все в пр в yii-web пока?
Да
источник

a

artem in Yii Framework 3
Alexander Makarov
Дока есть уже. Yiisoft/docs
Ткни, пожалуйста, в доку по инекциям
источник

a

artem in Yii Framework 3
Я просто к вам не часто захожу. Сейчас 5.1 20.04 уже сам теряюсь
источник

DS

Dmitriy S in Yii Framework 3
artem
Ткни, пожалуйста, в доку по инекциям
Зачем там дока? Оно в любом фреймворке одинаково работает. Только тут еще и в экшины контрллера внедряется автоваерингом.
источник

a

artem in Yii Framework 3
Dmitriy S
Зачем там дока? Оно в любом фреймворке одинаково работает. Только тут еще и в экшины контрллера внедряется автоваерингом.
Вот это и хотел услышать. Автовайринг
источник

А

Алексей R in Yii Framework 3
Если я драфт PR сделаю, то его все также смогут пощупать?
источник

А

Алексей R in Yii Framework 3
https://github.com/yiisoft/yii-demo/pull/75

===

Пришлось сделать свой ActionCaller, который принимает любые данные от экшена.
Если это не стрим и не респонс, то вызывается SmartStreamFactory, которая создаёт стрим в зависимости от типа данных:
- дефольный StreamFactoryInterface для типов строка/файл/ресурс, которые описаны в StreamFactoryInterface;
- DataStream для массивов/объектов;
- добавил GeneratorStream для генераторов просто чтобы был.
Естественно, SmartStreamFactory можно сделать конфигурируемым, но сейчас не об этом.
Если сделать SmartStreamFactory чем-то вроде Injector'а, то можно будет его удобно юзать везде, где надо завернуть данные в стрим.

- После того, как данные завернули в DataStream, формата представления у данных ещё нет.
Формат вместе с конвертером данных навязывается стриму методом setConverter, где указывает класс конвертера и параметры конвертирования.
$stream->setConverter(XMLConverter::class, ['version' => '1.0'])


- Когда происходит рендеринг данных в контент?
- При завершении работы мидлвари RenderDataStream. До тех пор DataStream просто держит в себе сырые данные. При этом стрим не читабельный (при попытке чтения будет исключение).
При рендере из стрима берётся класс конвертер, резолвится и применяется к стриму.
Если конвертер в стриме не указан, то берётся по умолчанию (висит TODO для определения типа из заголовков запроса, это не проблема, просто пока не тратил на это время)

- Как сделать конкретный тип данных на маршруте/группе?
- для этого написал мидлварь, которая задаёт кастомный конвертер для стрим. Эту мидлварь можно вешать на роут:
Route::get('archive/json', new ActionCaller(ArchiveController::class, 'index', $container))
   ->addMiddleware(new SetStreamConverter(JSONConverter::class)) // <== ТУТ
   ->name('blog/archive/index/json'),

Здесь тоже можно в перспективе оптимизировать, чтобы не создавать лишних объектов мидлварей, если что

- Как сделать конкретный тип данных в экшене?
- Экшен должен вернуть стирм с указанным типом. Создаём стрим с помощью SmartStreamFactory и вешаем конвертер.

Чисто поржать (наверное) сделал WebView конвертер. В коде это выглядит так:
Route::get('archive', new ActionCaller(ArchiveController::class, 'index', $container))
   ->addMiddleware(
       new SetStreamConverter( // мидлварь, вешающая конвертер на стрим
           MyWebViewConverter::class,
           // Параметры для конвертера
           [
               'viewPath' => '@views/blog/archive',
               'view' => 'index',
               'layout' => '@views/layout/main.php',
           ]
       )
   )
   ->name('blog/archive/index'),


Ещё о конвертерах:
Любой конвертер данных также можно попросить повесить соответствующие заголовки на респонс. Не уверен, возможно я пересмотрю это действие (перенесу в идлварь)
В методах конвертированя костыли, которые надо заменить, на них не обращайте внимания.

Как проверить работу: заходим в Архив блога /blog/archive, там будут кнопки для получения одних и тех же данных в JSON, XML, print_r. Сама страница уже конвертирована конвертером MyWebViewConverter из примера выше
источник

a

artem in Yii Framework 3
Сделай git push --force
источник

DS

Dmitriy S in Yii Framework 3
Алексей R
https://github.com/yiisoft/yii-demo/pull/75

===

Пришлось сделать свой ActionCaller, который принимает любые данные от экшена.
Если это не стрим и не респонс, то вызывается SmartStreamFactory, которая создаёт стрим в зависимости от типа данных:
- дефольный StreamFactoryInterface для типов строка/файл/ресурс, которые описаны в StreamFactoryInterface;
- DataStream для массивов/объектов;
- добавил GeneratorStream для генераторов просто чтобы был.
Естественно, SmartStreamFactory можно сделать конфигурируемым, но сейчас не об этом.
Если сделать SmartStreamFactory чем-то вроде Injector'а, то можно будет его удобно юзать везде, где надо завернуть данные в стрим.

- После того, как данные завернули в DataStream, формата представления у данных ещё нет.
Формат вместе с конвертером данных навязывается стриму методом setConverter, где указывает класс конвертера и параметры конвертирования.
$stream->setConverter(XMLConverter::class, ['version' => '1.0'])


- Когда происходит рендеринг данных в контент?
- При завершении работы мидлвари RenderDataStream. До тех пор DataStream просто держит в себе сырые данные. При этом стрим не читабельный (при попытке чтения будет исключение).
При рендере из стрима берётся класс конвертер, резолвится и применяется к стриму.
Если конвертер в стриме не указан, то берётся по умолчанию (висит TODO для определения типа из заголовков запроса, это не проблема, просто пока не тратил на это время)

- Как сделать конкретный тип данных на маршруте/группе?
- для этого написал мидлварь, которая задаёт кастомный конвертер для стрим. Эту мидлварь можно вешать на роут:
Route::get('archive/json', new ActionCaller(ArchiveController::class, 'index', $container))
   ->addMiddleware(new SetStreamConverter(JSONConverter::class)) // <== ТУТ
   ->name('blog/archive/index/json'),

Здесь тоже можно в перспективе оптимизировать, чтобы не создавать лишних объектов мидлварей, если что

- Как сделать конкретный тип данных в экшене?
- Экшен должен вернуть стирм с указанным типом. Создаём стрим с помощью SmartStreamFactory и вешаем конвертер.

Чисто поржать (наверное) сделал WebView конвертер. В коде это выглядит так:
Route::get('archive', new ActionCaller(ArchiveController::class, 'index', $container))
   ->addMiddleware(
       new SetStreamConverter( // мидлварь, вешающая конвертер на стрим
           MyWebViewConverter::class,
           // Параметры для конвертера
           [
               'viewPath' => '@views/blog/archive',
               'view' => 'index',
               'layout' => '@views/layout/main.php',
           ]
       )
   )
   ->name('blog/archive/index'),


Ещё о конвертерах:
Любой конвертер данных также можно попросить повесить соответствующие заголовки на респонс. Не уверен, возможно я пересмотрю это действие (перенесу в идлварь)
В методах конвертированя костыли, которые надо заменить, на них не обращайте внимания.

Как проверить работу: заходим в Архив блога /blog/archive, там будут кнопки для получения одних и тех же данных в JSON, XML, print_r. Сама страница уже конвертирована конвертером MyWebViewConverter из примера выше
Первый минус - привязка к ActionCaller. Второй минус, нет иерархии форматтеров, третий - нет работы с сырыми данными, четвертый - нужна отдельная мидлтварь для рендеринга. Это я еще не ставил себе, так, на вскидку.
источник

А

Алексей R in Yii Framework 3
1 она и так в роутере по умолчанию :) это на замену роутерного ActionCaller'а
2 не проблема добавить, я там todo для этого оставил
3 тебе надо доанные из стрима получить? добавь метод getData() в стрим :) я его сначала добавил,потом подумал - нафиг он там не нужен
4 и это хорошо. Потому что заголовки должны назначаться в мидлвари. Ты можешь сам решить, когда у тебя должен рендериться контент, двигая её туда-сюда.
источник

DS

Dmitriy S in Yii Framework 3
1 Роутер необязательный пакет, без негшо все тоже должно работать
источник

А

Алексей R in Yii Framework 3
Dmitriy S
1 Роутер необязательный пакет, без негшо все тоже должно работать
ты против интерфейса пойти хочешь или чего? юзай SmartStreamFactory где угодно и будет тебе счастье
источник

DS

Dmitriy S in Yii Framework 3
2. Добавь, там посмотрим
3. Аналогично
4. В моем решении тоже можно рендерить на любом этампе, если в этом есть необходимость.
источник

А

Алексей R in Yii Framework 3
Dmitriy S
2. Добавь, там посмотрим
3. Аналогично
4. В моем решении тоже можно рендерить на любом этампе, если в этом есть необходимость.
у тебя рендерится при попытке взять стрим, да ещё и заголовки вещаются 😐
источник

DS

Dmitriy S in Yii Framework 3
Алексей R
ты против интерфейса пойти хочешь или чего? юзай SmartStreamFactory где угодно и будет тебе счастье
Перечитай диалоги выше, если у тебя экшин - мидлтварь, то до одного места твой смарт стрим
источник