Laravel & PHP Deep — фреймворки и пакеты
435 subscribers
10 photos
2 videos
23 links
PHP-стек: Laravel, Symfony, Composer, Octane, Filament, Livewire. Релизы, security advisories, лучшие пакеты для трекеров/CRM/арб-инфры. Тестирование, деплой, performance.
Канал сети public.tg.
Download Telegram
Filament ломает не админку, а дисциплину вокруг полей, ролей и таблиц

Если в проекте Filament “вроде бы уже стоит”, а дальше начинаются костыли, обычно проблема не в пакете. Проблема в том, что ресурс собирают как набор красивых форм, а не как слой управления данными. Отсюда дубли полей, лишние запросы и страницы, которые невозможно сопровождать без боли.

Перед тем как добавлять новый Resource, проверь базу:
— какие поля реально нужны оператору;
— какие действия можно вынести в отдельный Action;
— где нужен RelationManager, а где достаточно таблицы с фильтром;
— какие поля должны быть read-only, чтобы не плодить ошибки.
Если этого нет, Filament быстро превращается в конструктор случайных экранов.

Отдельно смотри на авторизацию. Policies и scopes должны определять доступ до рендера интерфейса, а не после клика по кнопке. Иначе у тебя “красивый” экран, который показывает лишние строки, лишние кнопки и лишние ожидания у команды поддержки. Для CRM, трекеров и арбитражной инфраструктуры это особенно дорого.

Ещё одна частая ошибка — тащить в форму тяжелую логику из модели. В Filament лучше держать UI тонким: валидация, отображение, простые трансформации. Бизнес-правила — в сервисах или доменном слое, иначе любое изменение формы начинает ломать не только админку, но и запись данных.

Если Filament используется как операционная панель, а не как витрина, он окупается быстро. Но сначала сделай ресурсы скучными, предсказуемыми и узкими — именно это потом экономит недели поддержки.
Octane ускоряет Laravel не магией, а ценой дисциплины в коде и окружении

Octane полезен там, где приложение много раз выполняет один и тот же bootstrap: меньше повторной инициализации, меньше лишней работы на каждый запрос. Но вместе со скоростью он приносит главный риск — состояние, которое живёт дольше одного HTTP-запроса.

Есть наблюдение которое стоит проверить: если в приложении есть глобальные синглтоны, статические кэши, мутируемые сервисы или «удобные» вспомогательные переменные в контейнере, Octane быстро превращает это в баги. То, что в FPM сбрасывалось после запроса, здесь может протечь в следующий запрос.

Перед включением проверь:
— нет ли записи в статические свойства из request scope;
— не хранится ли пользовательский контекст в singleton-сервисах;
— не мутируются ли объекты, которые должны пересоздаваться;
— очищаются ли слушатели, очереди, буферы и временные коллекции.

Для теста возьми один и тот же сценарий с разными пользователями подряд. Если ответы начинают «помнить» чужие данные — проблема не в Octane, а в lifecycle приложения. Он просто делает её видимой. ⚠️

Хорошая практика простая: всё, что зависит от запроса, держи в scoped-объектах или передавай явно. Тогда Octane даст ускорение без сюрпризов.
PHP ломается не там, где синтаксис, а где типы и границы входных данных

В реальных проектах большинство багов в PHP сидят в одном из трёх мест: вход пришёл не того типа, строка внезапно пустая, массив оказался ассоциативным вместо списка. Самый дешёвый способ ловить это — не доверять данным из request, env, queue payload и внешних API по умолчанию.

Минимальный чек-лист:
— включайте strict_types там, где это не ломает легаси;
— валидируйте форму данных до бизнес-логики;
— не смешивайте “null значит нет значения” и “пустая строка значит пусто”;
— для массивов проверяйте не только наличие ключа, но и ожидаемую структуру;
— на границе домена приводите типы явно, а не через неявные касты.

Отдельная ловушка — array functions и сравнения. В PHP "0", 0, false и "" легко начинают жить одной жизнью, если использовать loose comparison. Для фильтров, флагов и идентификаторов это источник тихих ошибок, которые тесты часто не ловят с первого прохода.

Если нужно одно правило на каждый проект: данные можно принять как угодно, но внутрь домена они должны попасть уже нормализованными. Тогда PHP перестаёт удивлять в проде и начинает вести себя предсказуемо.
This media is not supported in your browser
VIEW IN TELEGRAM
Google выпустил Android 17

Android получил встроенную Gemini с функциями автоматизации задач, конспектирования браузера и редактирования медиа. Обновление принесло новый интерфейс Bubble, двухкамерную запись и игровой режим для складных телефонов. Критический момент: Gemini Intelligence требует Gemini Nano v3 и минимум 12 ГБ RAM, что ограничивает аудиторию премиум-девайсов. Это создаёт потенциал для таргетинга криптооффера на узкий сегмент владельцев флагманов, готовых пл…

➡️ Читайте на сайте: https://aff.top/blog/google-vypustil-android-17

🧠 Ещё больше инсайтов → в канале AFF.top
Laravel Octane ускоряет приложение, но ломает привычки обычного PHP-FPM

Octane держит приложение в памяти, поэтому код перестаёт жить по модели «запрос пришёл — процесс умер». Это сразу бьёт по местам, где раньше можно было безнаказанно создавать singleton с состоянием, кешировать что угодно в свойствах и не думать о сбросе между запросами.

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

Второе: любые подключения и ресурсы нужно проверять на повторное использование. PDO, curl, файловые дескрипторы, клиенты к внешним API — если они не рассчитаны на долгую жизнь, получите странные зависания и утечки памяти. В Octane полезно смотреть не только на скорость ответа, но и на рост памяти под нагрузкой.

Третье: очистка состояния после запроса — не формальность. Если пакет или ваш код меняют контейнер, кэшируют конфиг в рантайме или держат локальный кеш в property, нужен явный reset-хук. Для самописных компонентов это обычно дешевле, чем потом ловить «призрачные» баги.

Хорошая привычка: тестируйте приложение под несколькими последовательными запросами в одном процессе. Если поведение меняется от запроса к запросу — это не оптимизация, а утечка состояния.

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

Чаще всего проблемы всплывают не в контроллерах, а в границах проекта: автозагрузка, конфиги, env, кэш, права на файлы. Если это не зафиксировано в чек-листе, баги уезжают на прод и выглядят как «магия».

Держите базовый набор проверок:
— composer install без сюрпризов: lock-файл в репозитории, vendor не коммитят
— phpunit гоняет не только happy path, но и пустые входы, исключения, граничные значения
— .env не является единственным источником истины: важные настройки должны быть валидированы
— кэш конфигов и роутов очищается и собирается в том же порядке, что и на сервере

Ещё одна типовая дыра — несовместимость пакетов. Один composer update может незаметно сломать события, middleware или сериализацию. Поэтому перед мерджем полезно смотреть дерево зависимостей и проверять, нет ли пакета, который тянет за собой неожиданный контракт. Это особенно важно в Laravel-сборках с кучей мелких расширений.

Если нужен простой фильтр качества, ищите не «красивый код», а повторяемость: проект должен подниматься с нуля, тесты — проходить без ручных правок, а окружение — собираться одинаково на любой машине.
Laravel ломается не на роуте, а на небрежной сборке проекта

За неделю в репах чаще всего всплывает не «сложный баг», а набор мелких ошибок, которые потом выстреливают в проде.

— Смешивают бизнес-логику с контроллерами: в итоге тестировать нечего, а правки цепляют лишние места.
— Не разделяют FormRequest, сервисы и модели: валидация, трансформация и сохранение живут в одном классе.
— Пишут запросы к БД прямо в шаблонах и middleware: это быстро только до первого рефакторинга.
— Игнорируют очереди для тяжёлых задач: письма, вебхуки, генерация файлов и синхронизации начинают тормозить пользовательский поток.
— Не фиксируют контракты для внешних интеграций: меняется формат ответа — и ломается половина сценариев.

Есть наблюдение которое стоит проверить: если после изменения одной фичи приходится править три слоя приложения, архитектура уже просит разделения.

Для Laravel это обычно решается просто:
• тонкий контроллер;
• явный сервис или action;
• отдельные DTO/requests;
• очереди для асинхронщины;
• тест на критичный сценарий, а не на «всё подряд».

Если проект начал «пахнуть» комбайном, не лечите его новым пакетом. Сначала разрежьте ответственность по слоям — это дешевле, чем потом чинить каскадный отказ.
This media is not supported in your browser
VIEW IN TELEGRAM
Армения заблокирует онлайн-казино для получающих пособия

Армения ввела жёсткие ограничения на онлайн-гемблинг: запретила депозиты для получателей соцпособий и пенсий, ограничила остальным суммы до 20% дохода, обязала казино добавить кнопку самозапрета. Сайты, не подчинившиеся требованиям, будут заблокированы — технология реализации неясна. Проблемы с платёжками неизбежны. Криптоказино, вероятно, останутся без контроля, что открывает новый канал для залива трафика.

➡️ Читайте на сайте: https://aff.top/blog/armeniia-zablokiruet-onlain-kazino-dlia-poluchaiuschikh-posobiia

🧠 Ещё больше инсайтов → в канале AFF.top
This media is not supported in your browser
VIEW IN TELEGRAM
В DeepSeek добавили распознавание изображений

DeepSeek запустил бета-версию распознавания изображений — функция доступна бесплатно прямо в чате. Работает нестабильно, но для базовых задач подходит: например, проверить, есть ли на креативе узнаваемая знаменитость в нужном гео. Платная подписка не нужна.

➡️ Читайте на сайте: https://aff.top/blog/v-deepseek-dobavili-raspoznavanie-izobrazhenii

🧠 Ещё больше инсайтов → в канале AFF.top
This media is not supported in your browser
VIEW IN TELEGRAM
📡 Запустили AFF.TOP — медиа про арбитраж, ИИ и вайб-кодинг

Разбираем новости из мира ИИ, тренды вайб-кодинга, инсайды индустрии арбитража — без воды и продаж курсов.

👉 Подписаться на канал AFF.TOP
Почему PHPUnit ломает доверие к тестам чаще, чем сам код

Есть наблюдение которое стоит проверить: тесты начинают врать не из-за фреймворка, а из-за привычек команды.

— Сначала ловят только happy path и забывают про границы: пустые значения, null, дубли, неверные статусы.
— Потом прячут логику в моки: тест проходит, а реальная интеграция с сервисом уже рассыпается.
— Затем делают один большой тест на всё: он медленный, хрупкий и не показывает, где именно сломалось.

Рабочий подход проще: тестируй поведение, а не внутренности; выноси в отдельные кейсы правила валидации, авторизации и расчётов; моки используй только там, где внешний мир реально мешает. Если тест зависит от случайности, времени или порядка выполнения — он уже кандидат на переписывание 🧪

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

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

Есть наблюдение которое стоит проверить: у многих инцидентов причина не в Laravel или Symfony, а в одном сомнительном пакете из Composer.

— Нет тестов под свои кейсы. Если пакет покрывает только happy path, вы оплачиваете будущий баг своим продом.
— Слишком много магии. Хелперы, глобальные состояния, автоконфиг «сам всё подхватит» — потом сложно понять, где сломалось.
— Нет явного контракта API. Если названия методов, типы и поведение читаются только через исходники, интеграция будет хрупкой.
— Репозиторий живёт, но не дышит: issue закрываются без объяснений, PR висят, README обещает больше, чем код.
— Пакет тянет лишние зависимости. Для трекера, CRM или арбитражной обвязки это быстро превращается в конфликт версий и лишний вес.
— Нет стратегии совместимости. Если автор меняет поведение без миграций и deprecation-цикла, обновление всегда лотерея.

Перед установкой проверьте три вещи: лицензия, качество тестов, состав зависимостей. И ещё одно: можно ли заменить пакет тонким адаптером вокруг своего кода.

Если пакет не объясняет свои границы — лучше не делать его центром архитектуры.
This media is not supported in your browser
VIEW IN TELEGRAM
Google заставляет махать руками перед камерой

Google запустила новую капчу на основе распознавания движений — требует включённую камеру и помах руки перед экраном для подтверждения. Система отслеживает 21 точку-координату положения руки в реальном времени, а данные удаляются сразу после проверки. Для арбитражников это усложнит автоматизацию — обход вероятно будет работать через перехват хэша с положительным ответом. Капча пока на тестировании, но предвещает новый уровень защиты от ботов в и…

➡️ Читайте на сайте: https://aff.top/blog/google-zastavliaet-makhat-rukami-pered-kameroi

🧠 Ещё больше инсайтов → в канале AFF.top
Composer ломается не на install, а на мелочах вокруг него — вот чек-лист

Если в проекте Composer ведёт себя «странно», проверь базу: • composer.json без лишних platform-ограничений • composer.lock под версионным контролем • vendor не коммитится • в CI и локально один и тот же PHP и ext-* набор.

Дальше идут типовые ошибки: • ставят пакеты через require без понимания конфликтов semver • забывают, что scripts могут запускать код • игнорируют autoload-dev и получают мусор в тестах • тащат в проект deprecated-пакеты, а потом лечат симптомы, а не причину. Здесь помогает не магия, а дисциплина зависимостей.

Отдельно проверь автозагрузку: PSR-4 должен совпадать с реальными namespace и путями, а classmap — не разрастаться без нужды. Если сборка тормозит, смотрят на количество пакетов, лишние post-install скрипты и то, не тянет ли один «удобный» пакет половину экосистемы.

Вывод простой: Composer — это не менеджер пакетов, а контракт между кодом, окружением и CI. Чем раньше вы фиксируете правила в composer.json и lock-файле, тем меньше сюрпризов в проде.
This media is not supported in your browser
VIEW IN TELEGRAM
Как заработать 2500$ с УБТ трафика из Twitter’а не привлекая внимания санитаров

Арбитражник проkил органическbq трафик с X (Twitter) через связку с dating-офферами, используя маскировку ссылок под видеопревью. После полугода залива с марта по октябрь 2025-го он заработал скромный, но стабильный доход, внедрив динамическую генерацию страниц, обфускацию ссылок и cookie-разделение трафика для увеличения конверсии на треть. Основной вызов — постоянные баны доменом из-за обновлений Google и требований антифрода, из…

➡️ Читайте на сайте: https://aff.top/blog/kak-zarabotat-2500-s-ubt-trafika-iz-twitter-a-ne-privlekaia-vnimaniia-sanitarov

🧠 Ещё больше инсайтов → в канале AFF.top
PHP-проект начинает тормозить не из-за языка, а из-за пяти типовых мест

Если в приложении «всё на Laravel», а ответ всё равно медленный, почти всегда проблема не в одном месте. Сначала смотрят на самый длинный путь запроса: контроллер, сервисы, БД, внешние HTTP-вызовы, сериализацию.

— N+1 в отношениях: красивый код с `with()` экономит секунды там, где `foreach` по моделям съедает всё
— Лишние запросы в циклах: один `count()` на каждую запись выглядит безобидно, пока не идёт на тысячи строк
— Тяжёлые JSON-ответы: отдавать весь объект модели, когда нужен только `id`, `title` и статус — плохая привычка
— Синхронные внешние вызовы: любой API в лоб без таймаута и кэша превращает быстрый endpoint в очередь
— Дорогая бизнес-логика в HTTP: расчёты, генерация, агрегации и отчёты лучше уводить в очереди или отдельные сервисы

Отдельно проверяйте autoload и набор пакетов. Иногда медлит не бизнес-логика, а десятки мелких провайдеров, событий и макросов, которые поднимаются на каждый запрос.

Если нужен быстрый диагноз, идите по цепочке: запросы к БД → внешние HTTP → размер ответа → работа в циклах → лишние зависимости. В PHP это обычно даёт ответ быстрее, чем попытка «оптимизировать всё сразу».
Spatie в Laravel — это не “пакеты на всякий случай”, а способ не писать инфраструктуру заново

У Spatie сильная сторона не в магии, а в дисциплине: они закрывают типовые задачи так, чтобы код проекта не превращался в набор самописных костылей. Обычно в работу идут пакеты для ролей и прав, медиа, активностей, медиа-библиотеки, бэкапов, query builder и DTO-подходов.

Есть наблюдение которое стоит проверить: пакет Spatie нужен не там, где “можно быстро подключить”, а там, где у вас уже есть повторяемая бизнес-логика. Если правило описывается словами “у пользователя есть доступ, но не всегда”, “у сущности есть версии”, “нужно хранить события изменений” — почти наверняка дешевле взять готовое решение, чем поддерживать своё.

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

Хорошее правило простое: если пакет экономит вам тесты, миграции и edge cases — он свой. Если он экономит только пару часов на первом спринте, а потом мешает развитию — это не ускорение, а долг по архитектуре.
PHP чаще ломается не в синтаксисе, а в границах между слоями приложения

Когда код «вроде работает», проблемы обычно прячутся в местах, где один слой передаёт данные другому: контроллер — сервису, сервис — репозиторию, job — внешнему API.

Три типовые ошибки:
— смешивают валидацию, бизнес-логику и форматирование ответа в одном методе;
— тащат HTTP-зависимости в доменную часть;
— возвращают из глубины массива «как получилось», а не контракт с понятными типами.

Если проект живёт долго, спасает простое правило: каждый слой отвечает только за свой уровень абстракции. Контроллер знает про запрос и ответ, сервис — про сценарий, репозиторий — про данные, DTO — про форму передачи. Тогда тесты пишутся без боли, а баги не расползаются по всему стеку.

Ещё одна привычка, которая окупается: не использовать «универсальные» массивы там, где можно назвать структуру. В PHP это особенно заметно на больших проектах — неявность быстро превращается в дорогой дебаг 🛠️

Если код сложно читать без комментариев, почти всегда проблема не в PHP, а в архитектурной дисциплине.
Composer ломается не в install, а в привычках вокруг него: вот чек-лист

Composer — не просто менеджер пакетов, а точка, где проект либо собирается предсказуемо, либо начинает жить на удаче.

• Фиксируйте lock-файл и не правьте его руками: иначе у команды разные деревья зависимостей.
• Разделяйте require и require-dev: тестовые и dev-пакеты не должны уезжать в прод-сборку.
• Следите за platform.php в конфиге: локальная PHP-версия не должна маскировать несовместимость на сервере.

Отдельно проверяйте автозагрузку: classmap и PSR-4 должны совпадать с реальной структурой каталога, иначе ловите странные ошибки не в том месте, где их ждёте. И ещё одна типовая ловушка — слишком широкий диапазон версий; он удобен до первого неявного конфликта между пакетами.

Если нужен стабильный проект, относитесь к Composer как к контракту: lock, платформе и автозагрузке доверяют больше, чем «ну у меня же работает».
7 Laravel-ошибок, которые тихо ломают проект: от логики до деплоя

В Laravel чаще всего падает не фреймворк, а дисциплина вокруг него. Есть набор ошибок, которые годами повторяются в командах и на фрилансе: их не видно в happy path, но они бьют по поддержке, тестам и скорости изменений.

— Держат бизнес-логику в контроллерах. В итоге один action разрастается, а повторное использование превращается в копипаст.
— Не разделяют запросы, сервисы и модели. Когда валидация, преобразование данных и запись в БД живут вместе, код становится хрупким.
— Пишут запросы без индексов и не смотрят в N+1. Это особенно больно на списках, фильтрах и админках.
— Игнорируют очереди и кэш там, где задача не обязана выполняться синхронно. Пользователь ждёт, сервер шумит, а причина — одна лишняя тяжёлая операция.
— Не покрывают критические сценарии тестами. Обычно ломается не «редкий кейс», а базовый сценарий оплаты, регистрации или синхронизации.

Отдельно проверяй side effects: отправку писем, вебхуки, работу с файлами, интеграции с внешними API. Именно там баги дороже всего.

Если проект начинает «тормозить без причины», сначала смотри не на Laravel, а на структуру кода и количество скрытой магии.
Symfony ломается не на контроллерах, а на границах приложения: где вы сами это спрятали

У Symfony сильная сторона — предсказуемый каркас. Слабая — когда в проекте смешивают домен, HTTP и инфраструктуру, а потом удивляются «магии» контейнера.

Что чаще всего убивает поддержку:
— сервисы начинают читать Request напрямую;
— бизнес-правила уезжают в form/type или controller;
— репозитории возвращают DTO «на глаз»;
— события используют как замену нормальному потоку данных.

Рабочая схема проще: контроллер принимает ввод, валидирует форму запроса, дальше вызывает use case или сервис домена, а уже он решает, что сохранять, что публиковать и что вернуть. В этом месте Symfony не мешает — он только склеивает слои.

Если проект растёт, отдельно держите конфигурацию, автоконфиг и теги сервисов: там быстро видно, где начинается лишняя магия. И ещё один маркер зрелости — тесты на поведение, а не на то, что контейнер собрался «как надо». Это заметно снижает цену рефакторинга.

Чем раньше вы отделите правила от фреймворка, тем дольше Symfony останется инструментом, а не причиной переписывать код.