Новости Symfony 7.2
Всем привет!
На CutCode мы ежемесячно смотрим новости PHP и Laravel. Самое время поговорить о самом лучшем, самом совершенном, великолепном и бесподобном PHP-фреймворке современности - о Symfony!
Это Кирилл Несмеянов и я постараюсь ежемесячно радовать вас обзором новостей по Symfony. Общаемся если что в тематическом чате в telegram - https://t.me/symfony_cutcode .
Что ждет Symfony в ближайшее время
Ближайшие два месяца сделают нам подарок - в конце ноября выходит версия 7.2. Самое время обсудить новости за прошедший октябрь и рассказать о новом функционале и компонентах.
Несколько дней назад вышла версия 7.2 beta 1 (на момент написания статьи уже RC1), так что весь набор компонентов и функционала уже доступен для тестирования прямо сейчас.
Валидатор
Компонент валидатора предоставил нам 3 новых правила валидации (или 3 новых Assert’а, или Constraint’а, если использовать англицизмы).
Правило "Week" (неделя)
Проверяет переданную неделю на корректность у строки или Stringable-объекта согласно спецификации ISO 8601. В частности, этот формат применяется в соответствующем HTML-элементе "".
Напомню, что стандартный календарный год может содержать 52 или 53 недели. Правило обеспечивает не только корректность формата, но и корректность проверки этого интервала для текущего календарного года согласно указанной локали и времени.
Конечно, вы можете указывать ограничения на допустимый интервал отдельно, без ограничений на минимально и максимально допустимые значения.
Правило "WordCount" (количество слов)
Как и любая проверка, требующая строку, может обрабатывать любые строки (внезапно!) и Stringable-объекты.
Правило проверяет эту "строку" на количество слов. Однако подсчёт количества слов не совсем тривиальная задача и тесно связана с локалью.
Нельзя просто так взять и подсчитать количество пробельных или пунктуационных символов. Для разных языков могут использоваться различные символы для разделения слов. И там, где в одном языке какой-то символ является разделителем, в другом он всего лишь диалектическая особенность. Вспомним, к примеру, перенос одного слова с помощью дефиса в русском языке.
В любом случае, правило полагается на уже готовое и широко применимое расширение intl, а конкретно класс IntlBreakIterator.
Правило допускает указание максимального и минимального количества слов, а также явное указание локали для конкретного правила.
Правило YAML
Проверяет строку или Stringable-объект на соответствие YAML-формату. Кажется, что сложно придумать применение такому правилу валидации, однако бывают случаи, когда требуется сохранить, например, конфигурацию.
Конечно же, с помощью флагов мы можем указать дополнительные настройки для правил разбора YAML-формата.
Валидатор (часть 2)
Теперь можно объединять правила валидации в одно большое без написания агрегатов для обработчика. Достаточно отнаследоваться от класса Symfony\Component\Validator\Constraints\Compound и вернуть массив вложенных проверок.
Правда, возвращать требуется именно массив, а не iterable. Это хорошая возможность для контрибьюта в Symfony, так как изменение типа на iterable не нарушит обратную совместимость.
Улучшения консоли
Добавлен новый флаг "silent", работающий аналогично существующему "--quiet", однако исключающий из потока вывода не только логи и отладочную информацию, но и исключения и ошибки.
Это упростит систематизацию и агрегирование вывода, например в формате JSON, чтобы делегировать их сторонним сервисам и туда не попадало неструктурированных данных. Любители ELK-стека, возрадуйтесь!
Expression Language
Язык выражений используется для внедрения безопасных конфигурационных выражений, позволяющих императивно описывать правила внедрения зависимостей. Также императивно уточнять правила роутинга (например, для проверки наличия заголовка в запросе для соответствия какому-либо маршруту). Или, например, правил исключения полей DTO при сериализации их в JSON в том же JMS и прочего. Применяется довольно редко на практике, однако почему бы и нет.
Возвращаясь к новинкам, помимо существующих бинарных операций & (and), | (or) и ^ (xor) были добавлены операторы бинарных сдвигов, инвертирование битов (aka бинарный "NOT") и логический XOR.
В версии 7.2 также была добавлена поддержка комментариев в выражениях:
Вишенкой на торте является модификация сигнатуры конструктора для использования провайдеров iterable, а не только array:
Symfony грешит тем, что у многих сервисных компонентов требуются массивы, а не iterable, из-за чего невозможно передать tagged-итераторы или другие итераторы. Например, Application symfony консоли, куда в метод addCommands надо передать массив команд, а не итератор. Из-за этого приходится придумывать обходные пути.
Messenger
Раньше для маршрутизации сообщения требовалось указать конкретный транспорт или несколько транспортов, куда данное сообщение будет направлено:
Следуя современным трендам к упрощению сборки через атрибуты, в 7.2 был добавлен атрибут AsMessage:
Messenger (часть 2)
Для решения проблем с таймаутами добавлены:
1. Интерфейс KeepaliveReceiverInterface с методом keepalive
2. Событие ConsoleAlarmEvent для сигнала SIGALRM
3. Поддержка флага --keepalive для команд consume и retry
Symfony Serializer
В версии 7.2 появилась возможность создавать отдельные сериализаторы с полностью отдельными нормализаторами и настройками через секцию "named_serializers":
Можно использовать настройки по умолчанию, которые потом дополним или переопределим, или собирать эти настройки с нуля, не используя дефолтные. Ранее проще было зарегистрировать собственный сервис в контейнере, теперь произошла унификация.
Переводы (Translation)
Symfony уже включает множество линтеров, таких как проверка синтаксиса конфигурации и корректности настроек контейнера. Ранее существовала команда проверки файлов переводов в формате XLIFF (OASIS стандарт файлов интернационализации, ISO 21720).
В версии 7.2 добавлен общий линтер для валидации файлов переводов в любом формате:
Особенно полезно при использовании синтаксиса ICU формата, где легко забыть запятую, закрывающую скобку или ключ "other" при использовании множественного числа:
Symfony поддерживает команду "translation:extract" для автоматического извлечения переводов. В версии 7.2:
1. Добавлена опция "no-fill" - вместо заглушки вставляет пустую строку
2. В XLIFF-файлах пустая строка заменяет значение с двойным подчеркиванием
Помимо этого, опция sort теперь применяется к файлам каталога переводов
Контейнер
Начиная с версии 5.3 можно указывать окружения для регистрации сервисов. Например, отладочная команда для локальной среды:
В 7.2 добавили атрибут WhenNot для регистрации сервиса на всех окружениях кроме указанного:
Формы
Фреймворк предоставляет компонент EntityType для создания select-элементов, где значения берутся из сущности. Проблема в том, что при большом количестве значений браузер может зависнуть при отрисовке.
В Symfony 7.2 добавили опцию choice_lazy, позволяющую отключить принудительную отрисовку всех опций. За загрузку данных отвечает LazyChoiceLoader, который можно модифицировать.
В качестве альтернативы можно использовать поле автодополнения из набора компонентов Symfony UX, предоставляющее гибридную реактивную интеграцию бэкенда и фронтенда для простых случаев (например, админок).
Улучшения компонента работы со строками
Добавлен метод kebab - аналог snake_case, использующий дефисы вместо подчёркивания. Теперь вы можете официально "кебабить" в рабочее время и вам ничего за это не сделают!
Ранее можно было обрезать строку... Но не просто по буквам! Второй аргумент “cut” позволял оставить в сохранности последнее слово.
Начиная с версии 7.2, помимо булева значения также доступны режимы транкейта TruncateMode для "округления" результата обрезки в большую или меньшую сторону.
Ну и последнее. Добавлен испанский инфлектор (склонятор слов).
Теперь вы можете множить испанские слова без испанского стыда. Такие дела.
Нотификатор и Mailer
Добавлены новые драйверы и интеграции:
Для нотификатора:
- Primotexto
- Sipgate
- Sweego
- LINE Bot
Для Mailer:
- Mailchimp
- Sweego
- Mailomat
- Postal
- Mailtrap
Также для нотификаций
В симфони 7.2 добавлили драйвер нотификаций для... Рабочего стола!
Теперь вы можете слать нотификации прямиком на рабочий стол. Крайне удобно для какого-либо дебага. И крайне неудобно, если вы будете делать это на сервере.
Улучшения ядра (Framework Bundle)
Темплейт-контроллер теперь позволяет добавлять дополнительные заголовки ответа для статики:
Symfony/Twig bridge
Для упрощения частичной отрисовки можно использовать методы-хелперы RenderBlock и RenderBlockView из AbstractController. Это удобно при использовании Symfony UX Turbo или HTMX. В версии 7.2 функционал упростили - достаточно вернуть данные с указанием имени блока и шаблона.
Компонент конфигурации
Добавлен метод parameterCannotBeEmpty:
Symfony MIME
Во-первых, ранее список энкодеров для объекта TextPart был жёстко захардкожен и представлял из себя 3 типа: “quoted-printable”, “base64” и “8bit”. Теперь можно добавлять пользовательские энкодеры, что потребует реализовать 3 метода.
Зарегистрировать и использовать энкодер довольно просто:
Конечно, пихать всё возможное в статику - довольно странно, однако… Почему бы и нет?
Во-вторых, добавлена поддержка юникода для почты согласно RFC 6531 (https://datatracker.ietf.org/doc/html/rfc6531). Не латинские символы теперь возможно использовать не только для имени почты, но и для домена.
В новости об этом функционале ничего не сказано об автоматическом преобразовании таких имён в Punycode, который используется для обратной совместимости для юникодных имён. Так что имя в юникоде используется "как есть".
На этом новости о Symfony 7.2 за октябрь закончены.
Дайджест в формате видео
Кирилл Несмеянов