Библиотека пхпшника | PHP, Laravel, Symfony, CodeIgniter
10.4K subscribers
1.77K photos
31 videos
29 files
4.61K links
Все самое полезное для пхпшника в одном канале.

По рекламе: @tproger_sales_bot

Учиться у нас: clc.to/M561SQ

Для обратной связи: @proglibrary_feeedback_bot

РКН: https://gosuslugi.ru/snet/67a5d13cd6fa92100ee6f68b
Download Telegram
👀 Messenger Inbox поможет избежать повторной обработки сообщения

Воркер записал заказ в базу и завершился до подтверждения сообщения. Брокер доставляет его снова, а обработчик повторяет уже выполненную работу.

В 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
👍3👾1
👀 HttpClient сможет читать итоговый статус gRPC из HTTP trailers

Сервер может передать часть заголовков после тела ответа. Например, 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 позволит учитывать права пользователя прямо при валидации

Редактору можно писать описание любой длины, остальным пользователям — до 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
👍1🤩1👾1
💡 Symfony 8.2 позволит проверить выражения до запуска приложения

Ошибка в выражении для доступа или валидации может обнаружиться только при выполнении нужного запроса. Новая lint-команда поможет находить такие ошибки заранее.

В разборе ExpressionLanguage показаны проверка выражений, их компиляция в PHP и ограничение констант, к которым они обращаются.

При подготовке к Symfony 8.2 добавьте проверку выражений в CI. Так опечатка в редко используемом правиле обнаружится до выкладки.

➡️ Навигация: Вакансии • Задачи • Собеседования

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
💡 Symfony 8.2 упрощает обмен сообщениями между приложениями

Один сервис принимает заказ, другой отправляет письмо, третий обновляет данные. Чтобы они понимали друг друга, нужно согласовать формат сообщений и способ их передачи.

В разборе межсервисного обмена показаны новые возможности Messenger для взаимодействия отдельных приложений.

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

➡️ Навигация: Вакансии • Задачи • Собеседования

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
💡 Symfony 8.2 позволит задать ответ при неудачной проверке атрибута контроллера

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

В разборе новой возможности показано, как контроллер сможет обработать такой исход.

Полезно для действий, где пользователь должен понять причину отказа и следующий шаг. При обновлении проверьте эти ветки отдельными тестами: какой статус, текст и данные получает клиент.

➡️ Навигация: Вакансии • Задачи • Собеседования

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
💡 Symfony сможет строить JSON Schema из PHP-классов

Типы свойств, значения по умолчанию и ограничения валидации уже описывают структуру данных. Компонент 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 2.11 исправляет утечку токенов в composer.lock

При работе с приватными репозиториями Composer мог записывать HTTP-заголовки с токенами доступа в composer.lock. Если такой файл попадал в репозиторий, вместе с ним мог оказаться и секрет.

В Composer 2.11 это исправили. В выпуск также вошли исправления выхода за пределы каталога vendor при установке пакетов и обработки аргументов скриптов.

Обновите Composer на рабочих машинах и в CI. Если передавали токены через заголовки репозитория, проверьте composer.lock и историю Git. Найденные там токены нужно отозвать и выпустить заново.

➡️ Навигация: Вакансии • Задачи • Собеседования

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
💡 Laravel позволяет получать уведомления о долгих заданиях очереди

Задание очереди ещё выполняется, а пользователь уже несколько минут ждёт отчёт. Чтобы заметить такую ситуацию, полезно задать порог времени и отправить уведомление при его превышении.

В Laravel появился Queue::whenJobRunsLongerThan. Через него можно зарегистрировать обработчик для заданий, которые выполнялись дольше заданного времени.

Обработчик вызывается после выполнения задания. В нём удобно записать метрику, отправить сообщение в систему мониторинга или сохранить сведения для разбора.

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

➡️ Навигация: Вакансии • Задачи • Собеседования

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
💡 Symfony 8.2 позволит редактировать разные типы блоков в одной форме

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

В готовящейся Symfony 8.2 для этого появится PolymorphicCollectionType. Вы объявляете доступные формы и добавляете провайдер, который выбирает нужную по данным блока.

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

Ещё одна полезная настройка — entry_name: она связывает строки формы с идентификаторами элементов. Это пригодится, когда порядок коллекции меняется между открытием и отправкой формы.

➡️ Навигация: Вакансии • Задачи • Собеседования

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
💡 Time\Duration в PHP 8.6 сделает единицы таймаута явными

В одном 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