В нашем коде мы активно используем контейнер внедрения зависимостей для работы с сервисами. Но мы с вами мало внимания уделяли практикам написания самих сервисов. Этому я решил посвятить следующую большую подробную статью своём блоге @elisdnru
Но перед этим нужно разобраться с определениями, которые мы будем там использовать. Чтобы потом было понятнее. Поэтому сегодня рассмотрим, что в нашем коде чем является с точки зрения ООП.
Но перед этим нужно разобраться с определениями, которые мы будем там использовать. Чтобы потом было понятнее. Поэтому сегодня рассмотрим, что в нашем коде чем является с точки зрения ООП.
elisdn.ru
Структуры с процедурами или объекты?
Сравнение процедурной, функциональной и объектно-ориентированной парадигмы. Отделение объектов от структур и процедур. Введение понятия сервиса.
В личном блоге опубликовал импровизированный стрим на общеполезные темы:
Чем неудобен в разработке процедурный код. Какие сложности предметной области обнаруживаются при анализе бизнеса. Как использовать классы провайдеров для конфигурирования приложения и для организации гибкой модульности.
Репостить статьи и видео с сайта elisdn.ru здесь больше не буду. Для них рекомендую подписаться на канал @elisdnru. Там помимо стримов скоро выйдет вторая мега-статья про практики внедрения зависимостей.
А пока мы записываем и монтируем свежие видео для серии Slim & React про подключение маршрутизации и работу фронтенда с API в форме регистрации. Так что до встречи в следующих скринкастах 👍🏼
Чем неудобен в разработке процедурный код. Какие сложности предметной области обнаруживаются при анализе бизнеса. Как использовать классы провайдеров для конфигурирования приложения и для организации гибкой модульности.
Репостить статьи и видео с сайта elisdn.ru здесь больше не буду. Для них рекомендую подписаться на канал @elisdnru. Там помимо стримов скоро выйдет вторая мега-статья про практики внедрения зависимостей.
А пока мы записываем и монтируем свежие видео для серии Slim & React про подключение маршрутизации и работу фронтенда с API в форме регистрации. Так что до встречи в следующих скринкастах 👍🏼
Telegram
ElisDN.ru
О сложности домена и о провайдерах в PHP
Провели ленивый импровизированный стрим на общеполезные темы. Чем неудобен в разработке процедурный код и код без разделения. Какие сложности предметной области обнаруживаются при анализе бизнеса. Про сходства и различия…
Провели ленивый импровизированный стрим на общеполезные темы. Чем неудобен в разработке процедурный код и код без разделения. Какие сложности предметной области обнаруживаются при анализе бизнеса. Про сходства и различия…
Продолжаем разработку проекта.
Чтобы было где размещать формы регистрации и входа нам понадобятся новые страницы.
Поэтому сегодня вынесем общий шаблон вёрстки, установим маршрутизатор и с помощью Feature Flag добавим страницу для формы регистрации.
А перед этим заодно доустановим линтеры для Jest-тестов и доработаем E2E-тесты для возможности работы с асинхронными страницами и добавления тестов до кода.
Чтобы было где размещать формы регистрации и входа нам понадобятся новые страницы.
Поэтому сегодня вынесем общий шаблон вёрстки, установим маршрутизатор и с помощью Feature Flag добавим страницу для формы регистрации.
А перед этим заодно доустановим линтеры для Jest-тестов и доработаем E2E-тесты для возможности работы с асинхронными страницами и добавления тестов до кода.
deworker.pro
Шаблон страниц и маршрутизация
Доработка E2E-тестов для работы с асинхронными страницами. Вынесение общего шаблона вёрстки. Установка маршрутизатора и создание страницы для регистрации.
Осторожно, много кода и тестов :)
Сегодня сделали форму регистрации со страницей подтверждения. Организовали работу React с API. Добавили вывод доменных ошибок и ошибок валидации для полей. Отрефакторили код и вынесли клиент для работы с API. Сделали проксирование запросов с фронтенда на бэкенд. Добавили защиту от повторных кликов и вынесли компоненты для элементов формы для использования в других формах.
Сегодня сделали форму регистрации со страницей подтверждения. Организовали работу React с API. Добавили вывод доменных ошибок и ошибок валидации для полей. Отрефакторили код и вынесли клиент для работы с API. Сделали проксирование запросов с фронтенда на бэкенд. Добавили защиту от повторных кликов и вынесли компоненты для элементов формы для использования в других формах.
deworker.pro
Регистрация на React и работа с API
Программирование формы регистрации пользователя в React. Организация взаимодействия фронтенда с API. Работа через CORS-заголовки и через проксирование.
С фронтендом мы разобрались. Пора переходить к разработке API-бэкенда. Сегодня переведём API на PHP 8.0. Перейдём на сборку PHP-расширений в Dockerfile напрямую из исходников вместо использования PECL. Пропишем новые нативные типы. Также упростим PHPDoc-блоки за счёт перехода от Psalm-аннотаций на классические и за счёт удаления повторов.
deworker.pro
Переход на PHP 8.0
Перевод API на PHP 8.0. Сборка расширений напрямую из исходников вместо PECL. Добавление новых типов и упрощение PHPDoc-блоков за счёт перехода от Psalm-аннотаций и удаления повторов типов.
Многие спрашивали, почему мы проверяем свой код только на соответствие PSR-12, но не следим за другими нюансами и не используем популярный подход final or abstract для написания классов.
Сегодня как раз это и сделаем. Перейдём на использование инструмента PHP CS Fixer, рассмотрим полезные для нас правила и интегрируем с PHPUnit и PhpStorm.
Сегодня как раз это и сделаем. Перейдём на использование инструмента PHP CS Fixer, рассмотрим полезные для нас правила и интегрируем с PHPUnit и PhpStorm.
После формы регистрации осталось добавить вход в кабинет и восстановление пароля.
Для этого перед программированием нам нужно определиться, как мы будем осуществлять аутентификацию в приложении из JS-фронтенда и API.
Как раз сегодня рассмотрим практики аутентификации по токенам при работе с API и сравним классические подходы с использованием токенов в формате JWT.
И смоделируем по шагам процесс получения и обновления токенов по универсальной спецификации OAuth2, чтобы с нашим API могли работать сторонние клиенты.
Для этого перед программированием нам нужно определиться, как мы будем осуществлять аутентификацию в приложении из JS-фронтенда и API.
Как раз сегодня рассмотрим практики аутентификации по токенам при работе с API и сравним классические подходы с использованием токенов в формате JWT.
И смоделируем по шагам процесс получения и обновления токенов по универсальной спецификации OAuth2, чтобы с нашим API могли работать сторонние клиенты.
Мы с вами активно подключали сторонние компоненты, но в их исходники не заглядывали и код не анализировали. Пора это исправить :)
Для этого открываем обещанную ранее новую рубрику практического рефакторинга, где это будем делать.
Сегодня проведём разбор кода компонента OAuth 2.0 Server, который как раз будем использовать для аутентификации на бэкенде.
Сделаем форк репозитория и настроим локальный запуск тестов для проверки кода перед коммитом и отправкой Pull Request.
Займёмся упрощением кода сервера. Найдём и устраним избыточность интерфейса ответа. Удалим неиспользуемые аргументы. Увидим неудобство наличия сеттеров в сервисе и рассмотрим способы избавления от них. Избавимся от зависимости от конкретного класса путём добавления интерфейса для внедрения публичного ключа. И сделаем интерфейсы компактными.
Для этого открываем обещанную ранее новую рубрику практического рефакторинга, где это будем делать.
Сегодня проведём разбор кода компонента OAuth 2.0 Server, который как раз будем использовать для аутентификации на бэкенде.
Сделаем форк репозитория и настроим локальный запуск тестов для проверки кода перед коммитом и отправкой Pull Request.
Займёмся упрощением кода сервера. Найдём и устраним избыточность интерфейса ответа. Удалим неиспользуемые аргументы. Увидим неудобство наличия сеттеров в сервисе и рассмотрим способы избавления от них. Избавимся от зависимости от конкретного класса путём добавления интерфейса для внедрения публичного ключа. И сделаем интерфейсы компактными.
deworker.pro
Рефакторинг сеттеров и интерфейсов
Разбор кода компонента OAuth 2.0 Server. Упрощение кода сервера. Устранение избыточности интерфейсов. Избавление от сеттеров. Чем нам помогут интерфейсы.
Готов анонс новой рубрики скринкастов в блоге. Там подробнее, чем было здесь.
deworker.pro
Рефакторинг в реальных проектах
Открытие новой рубрики по практическому рефакторингу на реальных примерах готовых библиотек и фреймворков.
Подвезли новые релизы:
Сегодня обновим CS Fixer, переведём Doctrine ORM на использование PSR-6 для кэширования мета-информации, сделаем более безопасным Jenkinsfile и доустановим в образ Jenkins компилятор Rust для сборки зависимостей.
Сегодня обновим CS Fixer, переведём Doctrine ORM на использование PSR-6 для кэширования мета-информации, сделаем более безопасным Jenkinsfile и доустановим в образ Jenkins компилятор Rust для сборки зависимостей.
deworker.pro
Обновление Doctrine и Jenkins
Переход на CS Fixer 3. Переход на PSR-кэш для мета-информации в Doctrine ORM. Обновление Jenkins с компиляцией Python-библиотек с Rust.
Приступаем к реализации полноценной системы аутентификации на бэкенде.
Сегодня исследуем работу готового компонента League OAuth2 Server и проинтегрируем его в наш PHP-проект. Напишем требуемые сущности и репозитории по интерфейсам компонента. Добавим сохранение авторизационного кода и токена обновления через Doctrine.
Помимо этого обновим Docker-образы и напишем свою функцию env для более удобной работы с переменными окружения.
Сегодня исследуем работу готового компонента League OAuth2 Server и проинтегрируем его в наш PHP-проект. Напишем требуемые сущности и репозитории по интерфейсам компонента. Добавим сохранение авторизационного кода и токена обновления через Doctrine.
Помимо этого обновим Docker-образы и напишем свою функцию env для более удобной работы с переменными окружения.
deworker.pro
Интеграция OAuth2 Server
Исследование работы и интеграция в PHP-проект компонента League OAuth2 Server. Написание сущностей и репозиториев. Сохранение кодов через Doctrine.
Продолжаем интеграцию.
Когда у нас готовы сущности и репозитории создадим сам компонент OAuth-сервера. Для него сгенерируем файлы ключей и сделаем их деплой из Jenkins через Docker Secrets.
Сделаем страницу входа и контроллер для генерации и обновления токенов. Все контроллеры покроем функциональными тестами.
По аналогии с Command добавим Query-модель на DBAL для выполнения запросов на чтение данных из модуля.
И заодно рассмотрим, как можно избавиться от вызова синглтона SentrySDK в коде наших сервисов и экшенов.
Когда у нас готовы сущности и репозитории создадим сам компонент OAuth-сервера. Для него сгенерируем файлы ключей и сделаем их деплой из Jenkins через Docker Secrets.
Сделаем страницу входа и контроллер для генерации и обновления токенов. Все контроллеры покроем функциональными тестами.
По аналогии с Command добавим Query-модель на DBAL для выполнения запросов на чтение данных из модуля.
И заодно рассмотрим, как можно избавиться от вызова синглтона SentrySDK в коде наших сервисов и экшенов.
deworker.pro
Страница входа и Query-модель
Разработка страницы входа и контроллера для генерации и обновления OAuth-токенов. Добавление Query-модели для выполнения запросов данных из модуля.
После добавления полноценной генерации токенов пришла пора эти JWT-токены принимать и валидировать. И извлекать из них идентификатор пользователя для использования в контроллере.
Для этого создадим компонент сервера ресурсов. Добавим middleware для аутентификации и рассмотрим несколько вариантов его написания и использования.
Для этого создадим компонент сервера ресурсов. Добавим middleware для аутентификации и рассмотрим несколько вариантов его написания и использования.
deworker.pro
Аутентификация для контроллеров
Приём, валидация и чтение JWT-токенов для определения текущего пользователя в контроллерах. Написание посредника аутентификации.
Сегодня завершаем аутентификацию для бэкенда. Доделаем нюансы, не реализованные ранее.
Сначала добавим роль в JWT. Потом напишем генератор токенов для E2E тестов. И сделаем форсированное разлогинивание пользователя и автоочистку устаревших кодов из БД по Cron в Docker Swarm.
Сначала добавим роль в JWT. Потом напишем генератор токенов для E2E тестов. И сделаем форсированное разлогинивание пользователя и автоочистку устаревших кодов из БД по Cron в Docker Swarm.
deworker.pro
Роль в JWT и Cron в Docker Swarm
Завершаем аутентификацию для бэкенда. Добавление роли в JWT. Форсированное разлогинивание пользователя. Автоочистка устаревших кодов из БД.
При реализации аутентификации мы познакомились с использованием секретов Docker для передачи контейнерам файлов ключей для JWT.
По этим же мотивам сегодня мы повысим безопасность контейнеров. Сделаем передачу паролей через секреты вместо переменных окружения. И создадим отдельного пользователя для PHP-CLI, чтобы не запускать консольные команды от root. Это нам станет полезно когда мы добавим очереди.
Заодно обновим виртуальные машины до Debian 10 и Docker 20, чтобы работать со свежими инструментами.
По этим же мотивам сегодня мы повысим безопасность контейнеров. Сделаем передачу паролей через секреты вместо переменных окружения. И создадим отдельного пользователя для PHP-CLI, чтобы не запускать консольные команды от root. Это нам станет полезно когда мы добавим очереди.
Заодно обновим виртуальные машины до Debian 10 и Docker 20, чтобы работать со свежими инструментами.
deworker.pro
Docker и безопасность паролей
Обновление Debian и Docker на серверах. Перевод передачи паролей в контейнеры с переменных окружения на секреты. Работа с секретами в функции env.
При появлении в базе данных реальных записей возникает вопрос надёжности их хранения и резервного копирования, чтобы их случайно не потерять.
Об этом сегодня и позаботимся.
Сравним варианты запуска PostgreSQL в Docker, нативно и как облачный сервис. Рассмотрим, как сделать репликацию при запуске в Docker. И напишем скрипт резервного копирования БД с загрузкой дампа в S3-совместимое хранилище.
И для удобства поднимем эмулятор хранилища для локальной разработки.
Об этом сегодня и позаботимся.
Сравним варианты запуска PostgreSQL в Docker, нативно и как облачный сервис. Рассмотрим, как сделать репликацию при запуске в Docker. И напишем скрипт резервного копирования БД с загрузкой дампа в S3-совместимое хранилище.
И для удобства поднимем эмулятор хранилища для локальной разработки.
deworker.pro
Репликация и бэкап БД в S3
Запуск БД в Docker и без него. Способы организации репликации. Написание скрипта резервного копирования базы данных PostgreSQL с загрузкой в S3-совместимое файловое хранилище. Эмуляция хранилища для локальной разработки.
Стрим нового рабочего сезона
Спасибо за ваши предложения по контенту в комментариях и в обратную связь! С вами мы делаем наши видео лучше, чем изначально планировали.
Открываем новый рабочий сезон. Об этом поговорим с вами на стриме в эту пятницу 20 августа в 19:00 МСК.
Спасибо за ваши предложения по контенту в комментариях и в обратную связь! С вами мы делаем наши видео лучше, чем изначально планировали.
Открываем новый рабочий сезон. Об этом поговорим с вами на стриме в эту пятницу 20 августа в 19:00 МСК.
deworker.pro
Открытие нового рабочего сезона
Стрим о настоящем и будущем проекта. Направления и планы по записи новых эпизодов и перезаписи старых. Ответы на ваши вопросы в чате и комментариях.
В нашей инфраструктуре есть неудобства. В отличие от доменов и поддоменов при разработке и тестировании мы используем маршрутизацию по портам. При тестировании мы используем домен gateway вместо localhost. Все поддомены нам приходится вписывать вручную. И из-за монополии на 80 и 443 порты кластера мы не можем задеплоить несколько проектов.
Сегодня мы всё это решим. И от Nginx и Certbot перейдём на декларативное управление доменными именами и проксированием с помощью Traefik с автополучением Let's Encrypt сертификатов. И как бонус вынесем прокси-сервер в отдельный репозиторий, чтобы можно было деплоить в один кластер сколько угодно проектов
Сегодня мы всё это решим. И от Nginx и Certbot перейдём на декларативное управление доменными именами и проксированием с помощью Traefik с автополучением Let's Encrypt сертификатов. И как бонус вынесем прокси-сервер в отдельный репозиторий, чтобы можно было деплоить в один кластер сколько угодно проектов
deworker.pro
Управление хостами и Traefik
Декларативное централизованное управление доменными именами с помощью Traefik. Автополучение Let's Encrypt сертификатов. Деплой нескольких проектов в один кластер.