В переводе нужна ссылка внутри предложения. Частое решение — записать HTML прямо в строку и вывести её через
trans|raw. Вместе с разметкой такой подход пропускает в результат и неэкранированные параметры сообщения.В готовящемся Symfony 8.2 появится фильтр trans_html. В переводе остаются именованные псевдотеги:
auth_prompt: 'Чтобы продолжить, <signin>войдите</signin>.'
Шаблон задаёт, какой HTML им соответствует:
{{ 'auth_prompt'|trans_html(tags: {
signin: { tag: 'a', attr: { href: path('login') } }
}) }}Фильтр создаёт объявленные элементы и экранирует текст, параметры и значения атрибутов. Ссылка строится через маршрутизатор, переводчик управляет её положением в предложении.
Перед обновлением найдите шаблоны с
trans|raw. Начните с сообщений, в которые передаются имена пользователей и другие внешние данные.Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤1
Воркер записал заказ в базу и завершился до подтверждения сообщения. Брокер доставляет его снова, а обработчик повторяет уже выполненную работу.
В Symfony 8.2 появится Messenger Inbox. Он сохраняет идентификатор сообщения вместе с изменениями обработчика в одной транзакции. При повторной доставке Messenger находит запись и пропускает уже завершённую обработку.
Для подключения нужны
symfony/doctrine-messenger, настройка identity_stamps: true, опция inbox: true у транспорта и middleware doctrine_transaction. Inbox должен использовать то же соединение с БД, что и обработчик.Начать стоит с операций, которые меняют данные в этой БД. Для внешнего платежа или отправки письма отдельно предусмотрите защиту от повторного действия: транзакция базы их не охватывает.
Please open Telegram to view this post
VIEW IN TELEGRAM
Symfony
New in Symfony 8.2: Messenger Inbox (Symfony Blog)
Symfony 8.2 adds a Messenger inbox to skip messages that have already been processed, even if the worker crashes before acknowledging them.
👍3👾1
Сервер может передать часть заголовков после тела ответа. Например, gRPC отправляет туда результат вызова —
grpc-status и grpc-message. Эти поля называются HTTP trailers.В Symfony 8.2 HttpClient сохранит такие поля в информации об ответе. Прочитать их можно после завершения загрузки:
$body = $response->getContent();
$trailers = $response->getInfo('trailers');
До завершения передачи значение
trailers равно null. После успешной загрузки вернётся массив: пустой, если сервер ничего не прислал, или с полученными полями.Если работаете с потоковыми ответами или gRPC, проверьте, где получаете итог операции. Обычные заголовки и trailers читаются отдельно; в ответе gRPC без тела статус может прийти обычным заголовком.
Please open Telegram to view this post
VIEW IN TELEGRAM
Symfony
New in Symfony 8.2: HTTP Trailers (Symfony Blog)
Symfony 8.2 exposes the HTTP trailers sent by servers after the response body, both in the HttpClient component and in its Guzzle handler.
Редактору можно писать описание любой длины, остальным пользователям — до 280 символов. Такое правило удобно держать рядом с проверяемым полем.
В Symfony 8.2 функции проверки прав станут доступны в выражениях валидации. Например:
#[Assert\When(
expression: 'not is_granted("ROLE_EDITOR")',
constraints: [new Assert\Length(max: 280)],
)]
public string $summary = '';
Функция
current_user() даст доступ к текущему пользователю. С её помощью можно, например, запретить отправлять приглашение на собственный адрес.Такие проверки выполняются внутри HTTP-запроса. Если тот же объект проходит валидацию в консольной команде или воркере Messenger, функции проверки прав выбросят исключение. Учтите это при выборе групп валидации.
Please open Telegram to view this post
VIEW IN TELEGRAM
Symfony
New in Symfony 8.2: Security Expressions Everywhere (Symfony Blog)
Symfony 8.2 brings security functions to more expressions and adds current_user() to access the logged-in user.
👍1🤩1👾1
Ошибка в выражении для доступа или валидации может обнаружиться только при выполнении нужного запроса. Новая lint-команда поможет находить такие ошибки заранее.
В разборе ExpressionLanguage показаны проверка выражений, их компиляция в PHP и ограничение констант, к которым они обращаются.
При подготовке к Symfony 8.2 добавьте проверку выражений в CI. Так опечатка в редко используемом правиле обнаружится до выкладки.
Please open Telegram to view this post
VIEW IN TELEGRAM
Один сервис принимает заказ, другой отправляет письмо, третий обновляет данные. Чтобы они понимали друг друга, нужно согласовать формат сообщений и способ их передачи.
В разборе межсервисного обмена показаны новые возможности Messenger для взаимодействия отдельных приложений.
Материал пригодится при разделении системы на сервисы. Начните с одного сообщения: определите его поля, получателя и правила изменения формата, затем проверьте отправку и обработку в двух приложениях.
Please open Telegram to view this post
VIEW IN TELEGRAM
Атрибут контроллера проверяет условие перед выполнением действия. Если проверка завершается неудачно, приложению может понадобиться понятное сообщение или другой сценарий обработки запроса.
В разборе новой возможности показано, как контроллер сможет обработать такой исход.
Полезно для действий, где пользователь должен понять причину отказа и следующий шаг. При обновлении проверьте эти ветки отдельными тестами: какой статус, текст и данные получает клиент.
Please open Telegram to view this post
VIEW IN TELEGRAM
Типы свойств, значения по умолчанию и ограничения валидации уже описывают структуру данных. Компонент JsonSchema использует их для генерации схемы.
$generator = SchemaGenerator::create();
$schema = $generator->generate(
Type::object(Book::class)
);
В руководстве по компоненту разобраны схемы для классов, OpenAPI и параметров методов. Последний вариант пригодится для описания аргументов ИИ-инструментов.
Попробуйте генерацию на одном DTO и сравните результат с документацией API. Компонент требует PHP 8.2 и совместим с компонентами Symfony 7.4.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
При работе с приватными репозиториями Composer мог записывать HTTP-заголовки с токенами доступа в
composer.lock. Если такой файл попадал в репозиторий, вместе с ним мог оказаться и секрет.В Composer 2.11 это исправили. В выпуск также вошли исправления выхода за пределы каталога
vendor при установке пакетов и обработки аргументов скриптов.Обновите Composer на рабочих машинах и в CI. Если передавали токены через заголовки репозитория, проверьте
composer.lock и историю Git. Найденные там токены нужно отозвать и выпустить заново.Please open Telegram to view this post
VIEW IN TELEGRAM
Задание очереди ещё выполняется, а пользователь уже несколько минут ждёт отчёт. Чтобы заметить такую ситуацию, полезно задать порог времени и отправить уведомление при его превышении.
В Laravel появился Queue::whenJobRunsLongerThan. Через него можно зарегистрировать обработчик для заданий, которые выполнялись дольше заданного времени.
Обработчик вызывается после выполнения задания. В нём удобно записать метрику, отправить сообщение в систему мониторинга или сохранить сведения для разбора.
Начните с самых тяжёлых очередей: экспорта, обработки изображений и обращений к внешним сервисам. Для принудительной остановки зависшего задания отдельно настройте таймаут.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
В конструкторе страниц рядом живут заголовки, текстовые блоки и футеры. У каждого блока свои поля, поэтому для такой коллекции приходится подбирать форму отдельно для каждого элемента.
В готовящейся Symfony 8.2 для этого появится PolymorphicCollectionType. Вы объявляете доступные формы и добавляете провайдер, который выбирает нужную по данным блока.
Для добавления элементов в браузере Symfony подготовит отдельный прототип каждого типа. JavaScript сможет вставить форму заголовка или текста по выбору пользователя.
Ещё одна полезная настройка —
entry_name: она связывает строки формы с идентификаторами элементов. Это пригодится, когда порядок коллекции меняется между открытием и отправкой формы.Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
В одном API таймаут задаётся в секундах, в другом — в миллисекундах, в третьем — в микросекундах. Значение
250 приходится расшифровывать по документации или имени параметра.В PHP 8.6 появится Time\Duration — общий тип для длительности. Именованные конструкторы сразу показывают единицу измерения:
$timeout = Time\Duration::fromMilliseconds(250);
Объект хранит длительность с наносекундной точностью. Новый API ожидания событий в потоках станет одним из первых потребителей этого типа.
Если разрабатываете библиотеку, присмотритесь к нему при подготовке поддержки PHP 8.6: общий тип упростит передачу длительности между компонентами. Выпуск версии запланирован на 19 ноября.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤2