Библиотека пхпшника | 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
🛠 Laravel Cloud создаёт отдельное окружение для проверки каждого pull request

Один staging на всю команду быстро превращается в очередь: пока дизайнер смотрит одну ветку, следующую выкатывать нельзя.

В Laravel Cloud можно настроить автоматизацию, которая создаёт окружение при открытии pull request. У него будут собственный URL и отдельно созданные ресурсы. Новые коммиты обновляют развёрнутую версию, а после закрытия или слияния PR автоматическая очистка может удалить окружение и созданные для него ресурсы.

Это возможность платформы Laravel Cloud, а не функция, которая автоматически появляется в любом Laravel-приложении.

Изоляция важнее дополнительного URL

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

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

Полезный результат — возможность проверить весь пользовательский сценарий, не перезаписывая чужой staging.

🔗 Как устроены окружения для pull request

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
📌 Один курс — хорошее вложение в себя. Два по той же цене — ещё лучше.

В Proglib Academy действует акция: покупаешь один курс, а второй получаешь в подарок.

Например, можно совместить два направления по работе с ИИ:

💥 ИИ для разработчиков — применение нейросетей в повседневной разработке: работа с кодом, тестирование и ревью.

💥 Разработка ИИ-агентов — архитектура агентов и создание собственных AI-решений.


📍 Разница в цене — почти 50 тысяч рублей. Можно освоить больше, не выходя за рамки запланированного бюджета.

А если тебе интереснее Python, алгоритмы, backend или DevOps — выбирай другую пару курсов из каталога.

Акция действует до 31 октября включительно ⏳

⏮️ Пора прокачать свой стек
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱2
⚡️ Symfony 8.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
🔥5👍1
💡 Laravel MCP 1.0 ищет нужные инструменты в каталоге вместо передачи всех схем сразу

У MCP-сервера десятки инструментов. Если клиент заранее добавляет каждое описание и полную схему параметров в контекст модели, значительная его часть расходуется ещё до первого полезного вызова.

В Laravel MCP 1.0 разработчики выбрали каталог с поиском: агент сначала находит подходящий инструмент, затем получает необходимую информацию для вызова. Размер начального tools/list при этом не растёт вместе со всем каталогом.

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

Почему от eval() отказались

Сгенерированный код выполнялся в том же процессе, с доступом к окружению и базе приложения. Набор предложенных функций не ограничивал остальные возможности PHP. Успешные тестовые примеры не доказывали, что опасные действия невозможны.

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

Это разбор конкретной реализации. Не каждый MCP-клиент заранее загружает все схемы, а поиск инструмента не заменяет проверку прав при его выполнении.

🔗 История четырёх вариантов Laravel MCP

🐸 Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
🛠 После исправления критических уязвимостей PHP проверьте способ обновления приложения

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 сможет блокировать параллельные вызовы контроллера

Два запроса одновременно запускают импорт каталога. Оба обработчика читают и изменяют одни данные. В готовящемся 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

В Laravel Cloud появилась интеграция с Resend: отправку писем можно подключить как ресурс окружения. Аккаунт связывается один раз на уровне организации, затем для приложения выбираются домен и адрес отправителя.

Cloud показывает DNS-записи для SPF и DKIM и отслеживает подтверждение домена. Сами записи нужно добавить у своего DNS-провайдера. После подключения платформа создаёт ключ, хранит его зашифрованным и передаёт приложению через RESEND_API_KEY вместе с настройками почты.

Для тестового и рабочего окружений можно выпустить отдельные ключи. Тогда ключ тестового стенда получится заменить или отозвать независимо от продакшена.

Если приложение работает на Laravel Cloud, подключите интеграцию сначала к тестовому окружению. Проверьте письмо сброса пароля, приглашение и адрес отправителя.

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

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
🔔 Последние дни акции Proglib Academy! Покупаете один курс — второй получаете в подарок. Успейте до 31 октября.

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

⬆️ ИИ для разработчиков — системная работа с ИИ на всех этапах разработки: от планирования задачи до написания кода, тестирования и ревью.

⬆️ Разработка ИИ-агентов — создание собственных агентов для работы с данными, API и внешними сервисами. В программе — RAG, MCP, LangGraph, n8n и тестирование агентов.

Первый курс поможет встроить ИИ в привычный процесс разработки, второй — перейти к созданию собственных интеллектуальных инструментов.

🎁 А если эти направления не совсем то, что нужно, можно выбрать любые две программы из каталога.

Осталось совсем немного времени — акция заканчивается 31 октября!

👉 Подобрать свою пару курсов
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱2
💡 Symfony 8.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
👀 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
👍5❤3