PSR-7 фреймворк 2/7: Контроллеры и маршрутизация
HTML-код
- Опубликовано: 26 июн 2024
- Второй урок серии скринкастов по изучению PSR-7 микрофреймворков в PHP. Сегодня рассмотрим разделение на страницы и разделы сайта путём создания контроллеров и сопутствующей системы маршрутизации.
Обсуждение и исходники: elisdn.ru/blog/114/psr7-frame...
Обновленные эпизоды выходят на deworker.pro/edu/series/http-...
Блог: elisdn.ru
Скринкасты: deworker.pro
Задонатить: elisdn.ru/donate
Тайм-коды:
00:00:00 - Вступление, повторение выводов предыдущего урока
00:08:34 - Составление плана, создание новых страниц
00:11:57 - Избавление от копипасты, Postprocessing
00:15:43 - Prepocessing
00:20:37 - Обзор стадий выполнения
00:24:25 - Примитивная маршрутизация
00:26:15 - Экшен блога, маршрутизация блога
00:28:30 - Вынос экшена в файл
00:31:56 - Экшен как анонимная функция
00:34:48 - Экшен поста блога
00:40:56 - Суть контроллера
00:48:46 - Система маршрутизации, теория
00:58:22 - Коллекция маршрутов, теория
01:01:51 - Генерация адресов, теория
01:06:40 - Упрощённый синтаксис маршрутов, теория
01:12:46 - RouterTest
01:19:01 - RouteCollection
01:21:20 - Route
01:22:39 - Router
01:23:55 - Result
01:24:55 - Методы match и generate
01:26:18 - RequestNotMatchedExeption
01:28:07 - RouteNotFoundExeption
01:28:28 - Полноценный маршрутизатор, регулярные выражения
01:41:43 - Реализация маршрутизатора (Initialization)
01:43:30 - Реализация маршрутизатора (Running)
01:46:29 - Рефакторинг, GRASP
01:52:08 - Метод addRoute
01:55:16 - Интерфейс Route
01:57:28 - Вынесение экшенов в классы
02:02:07 - Группировка и разделение контроллеров
02:05:38 - Объект как функция
02:09:15 - HelloActionTest
02:10:44 - Ленивое создание объектов экшенов
02:15:28 - Добавление ActionResolver
02:21:21 - Готовые маршрутизаторы, теория
02:33:57 - Подключение Aura.Router
02:36:08 - Проблема перехода с одного маршрутизатора на другой
02:44:06 - AuraRouterAdapter
02:48:43 - Сила абстракции
02:52:33 - Выводы
Дмитрий самый лучший преподаватель на свете. Он не просто рассказывает как надо, а анализирует каждый шаг, давая нам самим понять причину принятых решений. Грамотный русский язык, прекрасная речь, добрая душа. Обожаю смотреть и пересматривать!
Дмитрий, спасибо!
Пожалуй лучшая серия видео про устройство фреймворков! Очень качественна подача материала, отличные примеры.
Благодарю! Много полезного и очень доходчиво )) Нравится, что показано тестирование, рефакторинг и вообще путь мысли от простого к сложному.
Фантастика!
Большое спасибо!Как всегда все качественно!
Дмитрий, спасибо за прекрасную работу!
1:58:30 - мяу!!!
Низкий поклон за подобные уроки!!!
Спасибо за урок! С удовольствием посмотрел первую часть :) Вы хорошо объясняете. Буду дальше смотреть :)
Спасибо за труд.
Дмитрий спасибо большое
Многое для себя открыл
не даром ты енот
Отлично!
всё по полочкам
Brilliant
Спасибо!
спасибо!
Спасибо
Дмитрий, как ты не устаешь столько без перерыва говорить?) В чем секрет?
Спасибо за отличное видео. Многие будут его использовать как полноценный курс. Возможно, более удобным будет размещать исходники для отдельных видео в отдельные git-репозитории.
Danila Popov Нет особого смысла разделять, так как всё идёт в истории коммитов и можно переключаться на любой шаг через git checkout.
@@DartMitai Ну, как, получилось? :)
@@DartMitai чё так?)
@@DartMitai эх, питонисты, лучше бы стал явастриптизёром))
@@DartMitai Глянул синтаксис дарта, выглядит и вправду классно, только не привычно будет без private/protected/public :)
а аннотация с протектед как-то костыльно выглядит
1:01:14 маршрутизатор
2:10:00 чтобы корректно запускались тесты, нужно обновить composer.json
в секции
"autoload": {
"psr-4": {
"App\\": "src/App/",
....
Я дополню. Если кому-то хочется передавать лишь строку с названием класса и строку с названием метода [HomeController::class, 'process'], можно переопределить статические методы __callStatic и __call, чтобы они соответственно вызывали нужные методы без инициализации объекта.
В итоге получается Laravel ))
ураааа! вася работает
я подключаю 10 тыс строк кода диакторса потому что мне лень писать 4 строчки хеадеров
на самом деле такой подход нужен для написания сложной и гибкой архитектуры
Наверное это вкусовщина, но ауровский выглядит интереснее, ввиду того, что в том экшене куда он передается не нужен роутер целиком, достаточно генератора. Но как пример для создания адаптера мне понравился.
Очень хорошо! Для меня пока сложновато, но все равно: для таких непростых тем у Дмитрия оптимальное сочетание - объема материала, детализации разжевывания и скорости подачи.
Если придираться, то залитый с github код не влетает на nginx в своем последнем коммите - ошибка 502. Если брать более ранние коммиты, то сайт работает.
Но это не страшно, будет самому интересно разобраться в чем проблема в конкретном коммите.
Не надо переменные в коде реплейсом менять, в PhpStorm есть для это специальная и удобная функция Refactor->Rename , которач учитывает область видимости ппременной.
Pochemu ne vikladivaetsya 1080 kachestva ? Vse je popriyatnee budet smotret nemnogo ...
1:40:00 в use передается &$arguments, но внутри изменений массива не происходит, в таком случае внутрь идет указатель и передача по ссылке получается не нужной.
Это экономит память, не создавая копий массивов.
Массив передается по ссылке, копия создается только если происходит изменение.
Примерно на 1:40:49 тесты не проходят, вываливаются 3 ошибки. 1я preg_match no ending delimiter '/' found 2, 3 unknown modifier '{'. Или я где-то провтыкал или в коде ошибка.
Провтыкал конкатенацию в preg_match (рядом с return метода match) префикса '~^' и постфикса '$~i'.
1:51:27 - почему снаружи generate и внутри для последнего аргумента 2 раза вызывается array_filter? Так должно быть?
Вы не один такой. Я пересматривал запись, но в ней Дмитрий упорно умалчивает об ошибке preg_match и конкатенации ~^ . $pattern . $~i
38:18 зачем использовать $request->withAttribute(), если get параметры итак можно достать методом $request->getQueryParams()?
При ЧПУ в адресе нет QueryParams.
ruclips.net/video/FkQ0IXnMxfA/видео.htmlh39m41s
в классе Router, в функции match(), в цикле foreach(), находится бессмысленное условие if(), которое всегда будет возвращать true.
if ($result = $route->match($request)) : всегда TRUE
изменить на проверку на соответствие:
if ($result == $route->match($request))
или проверить на соответствие еще и по типу:
if ($result === $route->match($request))
Строка:
if ($result = $route->match($request)) { ... }
это не сравнение, а сокращённая запись условия с присваиванием:
$result = $route->match($request);
if ($result) { ... }
Везде в if попадёт результат $route->match().
т.е. если $route->match($request) вернет 0 или false или null то условие не выполнится?
Не знал о такой возможности.
Тогда извиняюсь, был не прав...
Это не страшно что при создании 1000 маршрутов, при инициализации будет создаваться 1000 объектов Route?
Если большое количество регулярок будет тормозить, то можно попробовать сделать группировку маршрутов в Zend Router по префиксам как в Laravel или Slim.
А ещё в ларавеле есть кеширование роутов. Не знаю что именно оно кеширует и насколько сильно помогает, но оно есть. В других фреймворках наверно тоже есть что-то подобное.
✩░▒▓▆▅▃▂▁𝐓𝐞𝐱𝐭 𝐅𝐚𝐧𝐜𝐲▁▂▃▅▆▓▒░✩
Блин, ты лучше пиши уже его с нуля, или объясняй понятней и больше, а то что ты где-то берёшь этот код, это не кому не интересно, люди хотят сами программировать, а не пиздить код у всех. Задумайся, лучше 1час 20мин, который ты потратил на объяснение, можно было писать роутер с 0 и рассказать на ходу, так было понятней, а то что скопировал потом вставил этот код и сили потом гадай, а от куда взялось то или еще что-то, всем понятней когда программист пишет и рассказывает, а еще и показывает результат, а не показывать результат через 3 часа или вообще не показывать...
Этот стрим скорее не песочница "с оффис-менеджера до мистера синьора в одном видео", а некоторые подходы, принципы и фичи для тех, кто "в теме", но хочет получить информацию о том, как правильнее делать, лучше понять "как это готовят", в общем, для расширения кругозора, что-ли. Пробовать повторить это всё на ходу - плохая идея, а посмотреть и что-то новое узнать/сделать выводы, перенять опыт - самое то.