Один staging на всю команду быстро превращается в очередь: пока дизайнер смотрит одну ветку, следующую выкатывать нельзя.
В Laravel Cloud можно настроить автоматизацию, которая создаёт окружение при открытии pull request. У него будут собственный URL и отдельно созданные ресурсы. Новые коммиты обновляют развёрнутую версию, а после закрытия или слияния PR автоматическая очистка может удалить окружение и созданные для него ресурсы.
Это возможность платформы Laravel Cloud, а не функция, которая автоматически появляется в любом Laravel-приложении.
Изоляция важнее дополнительного URL
Проверять миграции и фоновые задания безопаснее с отдельными базой, кешем и тестовыми ключами интеграций. Подключённая рабочая база превращает проверку ветки в реальные изменения данных.
Для простаивающих окружений предусмотрено масштабирование до нуля там, где ресурс его поддерживает. Но это не обещание полностью бесплатного стека: хранение данных и другие ресурсы могут продолжать оплачиваться.
Полезный результат — возможность проверить весь пользовательский сценарий, не перезаписывая чужой staging.
Please open Telegram to view this post
VIEW IN TELEGRAM
Laravel
Preview environments and scale to zero: Better together | Laravel - The clean stack for Artisans and agents
Give every pull request its own preview environment on Laravel Cloud. Share a link, test the full stack, and let idle previews scale to zero.
В Proglib Academy действует акция: покупаешь один курс, а второй получаешь в подарок.
Например, можно совместить два направления по работе с ИИ:
💥 ИИ для разработчиков — применение нейросетей в повседневной разработке: работа с кодом, тестирование и ревью.💥 Разработка ИИ-агентов — архитектура агентов и создание собственных AI-решений.
А если тебе интереснее Python, алгоритмы, backend или DevOps — выбирай другую пару курсов из каталога.
Акция действует до 31 октября включительно
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱2
Контейнер уже знает, какие слушатели обрабатывают события. Зачем при создании диспетчера снова вызывать addListener() и создавать замыкания?
В разрабатываемом Symfony 8.2 сервис event_dispatcher использует CompiledEventDispatcher. Он получает заранее подготовленный массив идентификаторов сервисов и методов в нужном порядке. OPcache хранит массив в общей памяти, а локатор загружает слушателей по мере необходимости.
В приведённом микробенчмарке с 75 слушателями создание диспетчера сократилось с 33,7 до 0,48 микросекунды.
Это ускорение создания, а не всего приложения
Сама отправка событий работает с прежней скоростью. Слушатели по-прежнему создаются перед выполнением; если событие не отправлено или распространение остановлено, оставшиеся сервисы не создаются.
Добавление и удаление слушателей на общем event_dispatcher во время выполнения заставляет его перейти к обычному диспетчеру. В Symfony 8.2 такие вызовы помечаются устаревающими.
Перед обновлением стоит поискать addListener(), addSubscriber() и соответствующие удаления именно на общем сервисе.
Please open Telegram to view this post
VIEW IN TELEGRAM
Symfony
New in Symfony 8.2: Compiled Event Dispatcher (Symfony Blog)
Symfony 8.2 compiles event listeners into a PHP array to reduce dispatcher setup time and memory use.
🔥5👍1
У MCP-сервера десятки инструментов. Если клиент заранее добавляет каждое описание и полную схему параметров в контекст модели, значительная его часть расходуется ещё до первого полезного вызова.
В Laravel MCP 1.0 разработчики выбрали каталог с поиском: агент сначала находит подходящий инструмент, затем получает необходимую информацию для вызова. Размер начального tools/list при этом не растёт вместе со всем каталогом.
До этого команда пробовала другой подход: дать модели написать PHP, который вызовет несколько инструментов и обработает результаты внутри приложения.
Почему от eval() отказались
Сгенерированный код выполнялся в том же процессе, с доступом к окружению и базе приложения. Набор предложенных функций не ограничивал остальные возможности PHP. Успешные тестовые примеры не доказывали, что опасные действия невозможны.
Попытки добавить изоляцию усложнили решение. В итоге каталог оказался проще для этой задачи.
Это разбор конкретной реализации. Не каждый MCP-клиент заранее загружает все схемы, а поиск инструмента не заменяет проверку прав при его выполнении.
Please open Telegram to view this post
VIEW IN TELEGRAM
Laravel
A better way to build MCP servers with Laravel | Laravel - The clean stack for Artisans and agents
Every MCP tool loads on every request. Laravel MCP 1.0 fixes that with searchable tool catalogs: the same payload for 10 tools or 100.
❤1
21 октября вышли исправления двух критических уязвимостей PHP, допускающих удалённое выполнение кода без авторизации. Обновлённые версии: 8.5.12, 8.4.27, 8.3.36 и 8.2.35.
В инструкции для платформ Laravel разобраны действия для каждого способа размещения. На Laravel Cloud работающие приложения обновили автоматически. На Forge нужно нажать Update PHP для каждого сервера. На Vapor приложения с нативным runtime PHP 8.2 и новее требуется развернуть повторно; для собственного Docker-образа подготовить новое развёртывание.
Проверьте все окружения и процессы приложения: веб-сервер, очереди и задания по расписанию. Для контейнеров пересоберите образ с исправленной версией PHP и замените работающие экземпляры.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Два запроса одновременно запускают импорт каталога. Оба обработчика читают и изменяют одни данные. В готовящемся Symfony 8.2 для таких операций появится атрибут #[Lock]:
use Symfony\Component\HttpKernel\Attribute\Lock;
#[Lock('catalog-import', methods: 'POST')]
public function import(): Response
{
// Импорт каталога
}
Первый запрос получает блокировку. Конкурирующий запрос с тем же ключом по умолчанию получает
409 Conflict. Режим blocking: true позволяет дождаться освобождения блокировки.Это пригодится для импорта, генерации отчётов и других операций с общим ресурсом. Подберите ключ под этот ресурс и проверьте длительность обработки: стандартный TTL — 30 секунд. Для долгой работы блокировку нужно продлевать. При нескольких экземплярах приложения настройте общее хранилище блокировок.
Please open Telegram to view this post
VIEW IN TELEGRAM
👾4
В Laravel Cloud появилась интеграция с Resend: отправку писем можно подключить как ресурс окружения. Аккаунт связывается один раз на уровне организации, затем для приложения выбираются домен и адрес отправителя.
Cloud показывает DNS-записи для SPF и DKIM и отслеживает подтверждение домена. Сами записи нужно добавить у своего DNS-провайдера. После подключения платформа создаёт ключ, хранит его зашифрованным и передаёт приложению через
RESEND_API_KEY вместе с настройками почты.Для тестового и рабочего окружений можно выпустить отдельные ключи. Тогда ключ тестового стенда получится заменить или отозвать независимо от продакшена.
Если приложение работает на Laravel Cloud, подключите интеграцию сначала к тестовому окружению. Проверьте письмо сброса пароля, приглашение и адрес отправителя.
Please open Telegram to view this post
VIEW IN TELEGRAM
Можно совместить два направления и прокачать навыки сразу в нескольких областях:
Первый курс поможет встроить ИИ в привычный процесс разработки, второй — перейти к созданию собственных интеллектуальных инструментов.
Осталось совсем немного времени — акция заканчивается 31 октября!
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱2
В переводе нужна ссылка внутри предложения. Частое решение — записать 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
👍5❤3