Deworker Pro
1.41K subscribers
5 photos
187 links
Download Telegram
Впереди у нас подключение Serializer и проектирование доменной модели аукциона.

А пока перед этими темами завершим начатое ранее обновление конфигурации Doctrine ORM и переведём её консольные команды на инъекцию зависимостей в конструктор. Заодно перепишем структуры на использование модификатора readonly и переведём сервисы на синтаксис с constructor property promotion. Поворим, где это уместно, а где не очень.
Команды в контроллерах мы до сих пор заполняли данными из JSON-запросов вручную. Это неудобно. И любое несоответствие типов приведёт к ошибке 500 Server Error.

Вместо этого упростим себе работу и автоматизируем ввод и вывод JSON для наших запросов и команд с помощью компонента Serializer. И сделаем красивый вывод списка ошибок типов при неверных запросах.
Взгляд изнутри

Подготовка материала – это хорошо, но ведение проекта этим не ограничивается. Есть ещё много задач, размышлений и рутинных дел.

О внутренней работе и своих впечатлениях нам обычно рассказывает Юлия у себя в @elisjuli_live. На этот раз она делится результатами после жаркого лета.
Мы подготовили структуру проекта HTTP-фреймворка и разобрались с работой сервера. Теперь применим это на практике.

Сегодня создадим более сложную главную страницу с получением параметров HTTP-запроса и отправкой дополнительных заголовков ответа через SAPI при работе через PHP-FPM.

Заодно напишем первый вариант функции определения текущего языка и подумаем, что с ней не так.
У нас есть функция определения языка с прямым обращением к суперглобальным массивам PHP-FPM. Но такой подход неуниверсален и неудобен при тестировании.

Сегодня попробуем к этой функции написать unit-тесты и найти проблемы использования глобальных переменных и синглтонов. Познакомимся с неудобством побочных эффектов и с тестированием чистых функций.
В прошлом эпизоде мы поняли, что прямая работа с суперглобальными массивами привязывает нас к конкретному серверу и неудобна при тестировании.

Сегодня от этого перейдём к внедрению серверонезависимой структуры ServerRequest. Напишем для неё фабрику и для удобства перейдём на объекты-значения вместо скалярных полей.
Наш код формирования страницы не обращается к массивам PHP-FPM для получения запроса, но до сих пор вызывает SAPI для отправки ответа.

Сегодня избавимся от этой привязки и сделаем код страницы полностью независимым от используемого сервера структурой HTTP Response.

Заодно реализуем экономную отдачу больших файлов средствами PHP через Stream.
По вашим просьбам на сайте появилась возможность оплачивать подписку от имени организации или предпринимателя за своих сотрудников.

Если вы работодатель, то теперь можете зайти в кабинете в корпоративный раздел и подключить своих сотрудников.

Если вы сотрудник, то можете обратиться к своему работодателю, чтобы он подключил вас.
После написания ServerRequest и Response пора рассмотреть случаи, когда нам понадобится модификация запросов и ответов для служебных целей.

Сегодня этим и займёмся.

Поговорим про работу PHP с примитивами и объектами. Рассмотрим возможные проблемы и риски использования изменяемых объектов с сеттерами для запроса и ответа. Расскажем про иммутабельность и напишем надёжный код, избавленный от этих рисков.

Заодно упростим код формирования ответа и добавим поддержку множественных HTTP-заголовков.
Мы дошли до программирования доменной модели аукциона. У нас уже есть подробное задание, которое теперь нужно реализовать в коде.

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

Для этого мы вскоре рассмотрим Event Driven архитектуру и воспользуемся мощной практикой моделирования Event Storming.

Дабы не загромождать основную серию скринкастов мы вынесем это всё в отдельный плейлист по доменной модели.

Так что пока вы можете нас догнать, если ещё не досмотрели предыдущие эпизоды. И до встречи в новых скринкастах!
Исследование доменной модели у нас уже скоро. Это будет в новых скринкастах.

Но помимо аукциона нам будет крайне полезно рассмотреть примеры и из других предметных областей.

Для этого помимо скринкастов по аукциону мы проведём отдельный большой обобщающий практический стрим.

Успейте записаться к нам и до встречи в эфире!
Напоминаем участникам, что сегодня в 18:00 по московскому времени проведём наш стрим про разделение кода на модули и микросервисы. Рассмотрим идеи и принципы и закрепим их живым разбором подходящих примеров. Поотвечаем на ваши вопросы по этой теме и частично разберём ваши предметные области.

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

В карточке сейчас вывели ссылку на оригинальную запись. В будущем постараемся немного смонтировать видео и убрать различные заминки, чтобы всё смотрелось более интересно. Ещё в посте выложили изображения, нарисованные нами на стриме. Может кому-то пригодятся.
Мы редко пишем весь проект полностью с нуля. Вместо этого мы активно используем готовые компоненты от других программистов, подключая через Composer.

И если у нас несколько проектов, то может возникнуть желание вынести свой код в отдельную библиотеку, чтобы использовать её у себя или даже поделиться публично.

Но если код сильно связан с остальным кодом проекта или фреймворка, то вынести его в отдельную библиотеку весьма сложно.

Сегодня как раз рассмотрим повторное использование кода и на примере нашей функции покажем способы избавления от лишних связей через инверсию зависимостей.

И в итоге для написания переносимого кода перейдём на PSR-7 и совместимые с ним готовые компоненты.
После перехода на PSR-7 мы уже понимаем, как делать переносимыми функции, которые работают с переданным им Request-ом. Но пока не знаем, что делать с функциями, которые у себя создают Response.

Поэтому помимо других инверсий сегодня рассмотрим инверсию контроля за созданием зависимостей. Это нам позволит отвязаться от конкретных классов и понять причины появления PSR-17.

Помимо этого рассмотрим заблуждение многих PHP-програмистов при написании анонимных функций. Почему класс для них назван Closure и являются ли все анонимные функции замыканиями.
Начинаем моделирование предметной области проекта аукциона.

Сегодня рассмотрим домен и поддомены для нашего бизнеса с точки зрения DDD. Перейдём на Event Driven архитектуру для проведения сложных бизнес-процессов в системе слабосвязанных модулей.

Поговорим про сложности моделирования и познакомимся с практикой Event Storming для построения цепочек команд и событий.
Помимо комментариев на сайте много обсуждений проходит в разных чатах. Но полезные ответы в них безнадёжно теряются.

Чтобы это решить мы в разделе с вопросами и ответами открываем новую ветвь, куда будем цитировать свои ответы из чатов и из других переписок.

Сегодня опубликованы первые 7 вопросов и ответов.

Приятного чтения!

https://deworker.pro/qna/questions
Новые зрители (и те, кто повторно пересматривал прошлые эпизоды) сталкивались с трудностью, что код из репозитория аукциона не запускался на предыдущих коммитах из-за несовместимости со свежими Composer или Xdebug.

Сейчас это исправлено. Репозитоий перепроверен и во всех ключевых коммитах в Dockerfile вписаны совместимые версии. Теперь проект успешно запускается командой make init из любого предыдущего коммита.

Если вы раньше клонировали к себе репозиторий, то склонируйте его снова или загрузите новую историю через git fetch.
Разработка разработкой, но помимо неё приходят интересные новшества. Теперь устанавливать и работать с Docker Compose стало проще. В связи с этим сегодня переведём на новый Compose V2 наш проект вручную и наши Jenkins и Registry серверы автоматизированно через Ansible.