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 - Выводы

Комментарии • 57

  • @user-davidtema
    @user-davidtema 2 года назад +3

    Дмитрий самый лучший преподаватель на свете. Он не просто рассказывает как надо, а анализирует каждый шаг, давая нам самим понять причину принятых решений. Грамотный русский язык, прекрасная речь, добрая душа. Обожаю смотреть и пересматривать!
    Дмитрий, спасибо!

  • @ghost91827
    @ghost91827 3 года назад +1

    Пожалуй лучшая серия видео про устройство фреймворков! Очень качественна подача материала, отличные примеры.

  • @user-ot1gw3wt3z
    @user-ot1gw3wt3z 6 лет назад +7

    Благодарю! Много полезного и очень доходчиво )) Нравится, что показано тестирование, рефакторинг и вообще путь мысли от простого к сложному.

  • @user-davidtema
    @user-davidtema 2 года назад

    Фантастика!

  • @bobpps
    @bobpps 6 лет назад +3

    Большое спасибо!Как всегда все качественно!

  • @alexeydru9418
    @alexeydru9418 6 лет назад +1

    Дмитрий, спасибо за прекрасную работу!

  • @amirjaminov9353
    @amirjaminov9353 6 лет назад +5

    1:58:30 - мяу!!!

  • @sometexthere4169
    @sometexthere4169 6 лет назад +2

    Низкий поклон за подобные уроки!!!

  • @an.laskevych
    @an.laskevych 4 года назад +1

    Спасибо за урок! С удовольствием посмотрел первую часть :) Вы хорошо объясняете. Буду дальше смотреть :)

  • @michaelchizhevskiy6109
    @michaelchizhevskiy6109 6 лет назад

    Спасибо за труд.

  • @taalayedtech
    @taalayedtech 5 лет назад

    Дмитрий спасибо большое
    Многое для себя открыл

  • @temaovchinnikov3927
    @temaovchinnikov3927 5 лет назад

    Отлично!

  • @barrettM8
    @barrettM8 4 года назад

    всё по полочкам

  • @channeel165
    @channeel165 6 лет назад +1

    Brilliant

  • @VladimirSalygin
    @VladimirSalygin 3 года назад

    Спасибо!

  • @barrettM8
    @barrettM8 4 года назад

    спасибо!

  • @spice155
    @spice155 4 года назад

    Спасибо

  • @codingfox
    @codingfox 6 лет назад +17

    Дмитрий, как ты не устаешь столько без перерыва говорить?) В чем секрет?

  • @danvop
    @danvop 6 лет назад +4

    Спасибо за отличное видео. Многие будут его использовать как полноценный курс. Возможно, более удобным будет размещать исходники для отдельных видео в отдельные git-репозитории.

    • @ElisDN
      @ElisDN  6 лет назад +8

      Danila Popov Нет особого смысла разделять, так как всё идёт в истории коммитов и можно переключаться на любой шаг через git checkout.

    • @user-jn1px7rp3h
      @user-jn1px7rp3h 4 года назад

      @@DartMitai Ну, как, получилось? :)

    • @user-jn1px7rp3h
      @user-jn1px7rp3h 4 года назад

      @@DartMitai чё так?)

    • @user-jn1px7rp3h
      @user-jn1px7rp3h 4 года назад

      @@DartMitai эх, питонисты, лучше бы стал явастриптизёром))

    • @user-jn1px7rp3h
      @user-jn1px7rp3h 4 года назад

      @@DartMitai Глянул синтаксис дарта, выглядит и вправду классно, только не привычно будет без private/protected/public :)
      а аннотация с протектед как-то костыльно выглядит

  • @whatisintelligence6881
    @whatisintelligence6881 5 месяцев назад

    1:01:14 маршрутизатор

  • @AlexanderKryachko
    @AlexanderKryachko 3 года назад

    2:10:00 чтобы корректно запускались тесты, нужно обновить composer.json
    в секции
    "autoload": {
    "psr-4": {
    "App\\": "src/App/",
    ....

  • @windstepgaming5225
    @windstepgaming5225 4 года назад

    Я дополню. Если кому-то хочется передавать лишь строку с названием класса и строку с названием метода [HomeController::class, 'process'], можно переопределить статические методы __callStatic и __call, чтобы они соответственно вызывали нужные методы без инициализации объекта.

  • @k0repan0ff
    @k0repan0ff 6 лет назад +14

    В итоге получается Laravel ))

  • @user-kr5lm8eg3e
    @user-kr5lm8eg3e 5 лет назад +1

    ураааа! вася работает
    я подключаю 10 тыс строк кода диакторса потому что мне лень писать 4 строчки хеадеров

    • @ThisDaveAndThatJohn
      @ThisDaveAndThatJohn 5 лет назад

      на самом деле такой подход нужен для написания сложной и гибкой архитектуры

  • @efimov90
    @efimov90 5 лет назад

    Наверное это вкусовщина, но ауровский выглядит интереснее, ввиду того, что в том экшене куда он передается не нужен роутер целиком, достаточно генератора. Но как пример для создания адаптера мне понравился.

  • @estupidoParapente
    @estupidoParapente 3 года назад

    Очень хорошо! Для меня пока сложновато, но все равно: для таких непростых тем у Дмитрия оптимальное сочетание - объема материала, детализации разжевывания и скорости подачи.
    Если придираться, то залитый с github код не влетает на nginx в своем последнем коммите - ошибка 502. Если брать более ранние коммиты, то сайт работает.
    Но это не страшно, будет самому интересно разобраться в чем проблема в конкретном коммите.

  • @user-alexsumin
    @user-alexsumin 6 лет назад +4

    Не надо переменные в коде реплейсом менять, в PhpStorm есть для это специальная и удобная функция Refactor->Rename , которач учитывает область видимости ппременной.

  • @alexgolim2198
    @alexgolim2198 4 года назад +1

    Pochemu ne vikladivaetsya 1080 kachestva ? Vse je popriyatnee budet smotret nemnogo ...

  • @user-lb6br8ep6b
    @user-lb6br8ep6b 5 лет назад +2

    1:40:00 в use передается &$arguments, но внутри изменений массива не происходит, в таком случае внутрь идет указатель и передача по ссылке получается не нужной.

    • @bondarden
      @bondarden 5 лет назад

      Это экономит память, не создавая копий массивов.

    • @user-lb6br8ep6b
      @user-lb6br8ep6b 5 лет назад +1

      Массив передается по ссылке, копия создается только если происходит изменение.

  • @efimov90
    @efimov90 5 лет назад

    Примерно на 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? Так должно быть?

    • @amirjaminov9353
      @amirjaminov9353 5 лет назад

      Вы не один такой. Я пересматривал запись, но в ней Дмитрий упорно умалчивает об ошибке preg_match и конкатенации ~^ . $pattern . $~i

  • @user-jt1yl8wf6w
    @user-jt1yl8wf6w 5 лет назад

    38:18 зачем использовать $request->withAttribute(), если get параметры итак можно достать методом $request->getQueryParams()?

    • @ElisDN
      @ElisDN  5 лет назад +2

      При ЧПУ в адресе нет QueryParams.

  • @data-center-project
    @data-center-project 6 лет назад

    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))

    • @ElisDN
      @ElisDN  6 лет назад +2

      Строка:
      if ($result = $route->match($request)) { ... }
      это не сравнение, а сокращённая запись условия с присваиванием:
      $result = $route->match($request);
      if ($result) { ... }
      Везде в if попадёт результат $route->match().

    • @data-center-project
      @data-center-project 6 лет назад

      т.е. если $route->match($request) вернет 0 или false или null то условие не выполнится?
      Не знал о такой возможности.
      Тогда извиняюсь, был не прав...

  • @Valehtelt
    @Valehtelt 4 года назад

    Это не страшно что при создании 1000 маршрутов, при инициализации будет создаваться 1000 объектов Route?

    • @ElisDN
      @ElisDN  4 года назад +1

      Если большое количество регулярок будет тормозить, то можно попробовать сделать группировку маршрутов в Zend Router по префиксам как в Laravel или Slim.

    • @TKSherlock
      @TKSherlock 4 года назад

      А ещё в ларавеле есть кеширование роутов. Не знаю что именно оно кеширует и насколько сильно помогает, но оно есть. В других фреймворках наверно тоже есть что-то подобное.

  • @avetman9682
    @avetman9682 3 года назад

    ✩░▒▓▆▅▃▂▁𝐓𝐞𝐱𝐭 𝐅𝐚𝐧𝐜𝐲▁▂▃▅▆▓▒░✩

  • @codememory
    @codememory 4 года назад +2

    Блин, ты лучше пиши уже его с нуля, или объясняй понятней и больше, а то что ты где-то берёшь этот код, это не кому не интересно, люди хотят сами программировать, а не пиздить код у всех. Задумайся, лучше 1час 20мин, который ты потратил на объяснение, можно было писать роутер с 0 и рассказать на ходу, так было понятней, а то что скопировал потом вставил этот код и сили потом гадай, а от куда взялось то или еще что-то, всем понятней когда программист пишет и рассказывает, а еще и показывает результат, а не показывать результат через 3 часа или вообще не показывать...

    • @Merk462
      @Merk462 2 года назад +1

      Этот стрим скорее не песочница "с оффис-менеджера до мистера синьора в одном видео", а некоторые подходы, принципы и фичи для тех, кто "в теме", но хочет получить информацию о том, как правильнее делать, лучше понять "как это готовят", в общем, для расширения кругозора, что-ли. Пробовать повторить это всё на ходу - плохая идея, а посмотреть и что-то новое узнать/сделать выводы, перенять опыт - самое то.