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
Арбитражник про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: расчёты, генерация, агрегации и отчёты лучше уводить в очереди или отдельные сервисы
Отдельно проверяйте
Если нужен быстрый диагноз, идите по цепочке: запросы к БД → внешние HTTP → размер ответа → работа в циклах → лишние зависимости. В 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 — он свой. Если он экономит только пару часов на первом спринте, а потом мешает развитию — это не ускорение, а долг по архитектуре.
У Spatie сильная сторона не в магии, а в дисциплине: они закрывают типовые задачи так, чтобы код проекта не превращался в набор самописных костылей. Обычно в работу идут пакеты для ролей и прав, медиа, активностей, медиа-библиотеки, бэкапов, query builder и DTO-подходов.
Есть наблюдение которое стоит проверить: пакет Spatie нужен не там, где “можно быстро подключить”, а там, где у вас уже есть повторяемая бизнес-логика. Если правило описывается словами “у пользователя есть доступ, но не всегда”, “у сущности есть версии”, “нужно хранить события изменений” — почти наверняка дешевле взять готовое решение, чем поддерживать своё.
Но есть и типовая ошибка: ставить Spatie ради скорости старта и потом тащить пакет везде, даже где доменная модель уже не совпадает с его ограничениями. Так рождаются переусложнённые сервисы, лишние абстракции и миграции, которые потом больно распутывать. Пакет должен обслуживать вашу модель, а не подменять её.
Хорошее правило простое: если пакет экономит вам тесты, миграции и edge cases — он свой. Если он экономит только пару часов на первом спринте, а потом мешает развитию — это не ускорение, а долг по архитектуре.
PHP чаще ломается не в синтаксисе, а в границах между слоями приложения
Когда код «вроде работает», проблемы обычно прячутся в местах, где один слой передаёт данные другому: контроллер — сервису, сервис — репозиторию, job — внешнему API.
Три типовые ошибки:
— смешивают валидацию, бизнес-логику и форматирование ответа в одном методе;
— тащат HTTP-зависимости в доменную часть;
— возвращают из глубины массива «как получилось», а не контракт с понятными типами.
Если проект живёт долго, спасает простое правило: каждый слой отвечает только за свой уровень абстракции. Контроллер знает про запрос и ответ, сервис — про сценарий, репозиторий — про данные, DTO — про форму передачи. Тогда тесты пишутся без боли, а баги не расползаются по всему стеку.
Ещё одна привычка, которая окупается: не использовать «универсальные» массивы там, где можно назвать структуру. В PHP это особенно заметно на больших проектах — неявность быстро превращается в дорогой дебаг 🛠️
Если код сложно читать без комментариев, почти всегда проблема не в PHP, а в архитектурной дисциплине.
Когда код «вроде работает», проблемы обычно прячутся в местах, где один слой передаёт данные другому: контроллер — сервису, сервис — репозиторию, job — внешнему API.
Три типовые ошибки:
— смешивают валидацию, бизнес-логику и форматирование ответа в одном методе;
— тащат HTTP-зависимости в доменную часть;
— возвращают из глубины массива «как получилось», а не контракт с понятными типами.
Если проект живёт долго, спасает простое правило: каждый слой отвечает только за свой уровень абстракции. Контроллер знает про запрос и ответ, сервис — про сценарий, репозиторий — про данные, DTO — про форму передачи. Тогда тесты пишутся без боли, а баги не расползаются по всему стеку.
Ещё одна привычка, которая окупается: не использовать «универсальные» массивы там, где можно назвать структуру. В PHP это особенно заметно на больших проектах — неявность быстро превращается в дорогой дебаг 🛠️
Если код сложно читать без комментариев, почти всегда проблема не в PHP, а в архитектурной дисциплине.
Composer ломается не в install, а в привычках вокруг него: вот чек-лист
Composer — не просто менеджер пакетов, а точка, где проект либо собирается предсказуемо, либо начинает жить на удаче.
• Фиксируйте lock-файл и не правьте его руками: иначе у команды разные деревья зависимостей.
• Разделяйте require и require-dev: тестовые и dev-пакеты не должны уезжать в прод-сборку.
• Следите за platform.php в конфиге: локальная PHP-версия не должна маскировать несовместимость на сервере.
Отдельно проверяйте автозагрузку: classmap и PSR-4 должны совпадать с реальной структурой каталога, иначе ловите странные ошибки не в том месте, где их ждёте. И ещё одна типовая ловушка — слишком широкий диапазон версий; он удобен до первого неявного конфликта между пакетами.
Если нужен стабильный проект, относитесь к Composer как к контракту: lock, платформе и автозагрузке доверяют больше, чем «ну у меня же работает».
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, а на структуру кода и количество скрытой магии.
В Laravel чаще всего падает не фреймворк, а дисциплина вокруг него. Есть набор ошибок, которые годами повторяются в командах и на фрилансе: их не видно в happy path, но они бьют по поддержке, тестам и скорости изменений.
— Держат бизнес-логику в контроллерах. В итоге один action разрастается, а повторное использование превращается в копипаст.
— Не разделяют запросы, сервисы и модели. Когда валидация, преобразование данных и запись в БД живут вместе, код становится хрупким.
— Пишут запросы без индексов и не смотрят в N+1. Это особенно больно на списках, фильтрах и админках.
— Игнорируют очереди и кэш там, где задача не обязана выполняться синхронно. Пользователь ждёт, сервер шумит, а причина — одна лишняя тяжёлая операция.
— Не покрывают критические сценарии тестами. Обычно ломается не «редкий кейс», а базовый сценарий оплаты, регистрации или синхронизации.
Отдельно проверяй side effects: отправку писем, вебхуки, работу с файлами, интеграции с внешними API. Именно там баги дороже всего.
Если проект начинает «тормозить без причины», сначала смотри не на Laravel, а на структуру кода и количество скрытой магии.
Symfony ломается не на контроллерах, а на границах приложения: где вы сами это спрятали
У Symfony сильная сторона — предсказуемый каркас. Слабая — когда в проекте смешивают домен, HTTP и инфраструктуру, а потом удивляются «магии» контейнера.
Что чаще всего убивает поддержку:
— сервисы начинают читать Request напрямую;
— бизнес-правила уезжают в form/type или controller;
— репозитории возвращают DTO «на глаз»;
— события используют как замену нормальному потоку данных.
Рабочая схема проще: контроллер принимает ввод, валидирует форму запроса, дальше вызывает use case или сервис домена, а уже он решает, что сохранять, что публиковать и что вернуть. В этом месте Symfony не мешает — он только склеивает слои.
Если проект растёт, отдельно держите конфигурацию, автоконфиг и теги сервисов: там быстро видно, где начинается лишняя магия. И ещё один маркер зрелости — тесты на поведение, а не на то, что контейнер собрался «как надо». Это заметно снижает цену рефакторинга.
Чем раньше вы отделите правила от фреймворка, тем дольше Symfony останется инструментом, а не причиной переписывать код.
У Symfony сильная сторона — предсказуемый каркас. Слабая — когда в проекте смешивают домен, HTTP и инфраструктуру, а потом удивляются «магии» контейнера.
Что чаще всего убивает поддержку:
— сервисы начинают читать Request напрямую;
— бизнес-правила уезжают в form/type или controller;
— репозитории возвращают DTO «на глаз»;
— события используют как замену нормальному потоку данных.
Рабочая схема проще: контроллер принимает ввод, валидирует форму запроса, дальше вызывает use case или сервис домена, а уже он решает, что сохранять, что публиковать и что вернуть. В этом месте Symfony не мешает — он только склеивает слои.
Если проект растёт, отдельно держите конфигурацию, автоконфиг и теги сервисов: там быстро видно, где начинается лишняя магия. И ещё один маркер зрелости — тесты на поведение, а не на то, что контейнер собрался «как надо». Это заметно снижает цену рефакторинга.
Чем раньше вы отделите правила от фреймворка, тем дольше Symfony останется инструментом, а не причиной переписывать код.
Symfony легко «тормозит» не из-за фреймворка, а из-за пары типовых ошибок в приложении
Чаще всего проблема не в самом ядре, а в том, как собран проект:
— в одном контейнере живут всё подряд: сервисы, конфиг, side effects;
— запросы к БД размазаны по контроллерам и шаблонам;
— лишняя логика попадает в Twig и крутится на каждом рендере.
Есть наблюдение которое стоит проверить: если у вас растёт время ответа, сначала смотрите не на «Symfony медленный», а на границы слоёв. Контроллер должен собирать данные, а не считать бизнес-логику. Сервисы — делать одну вещь и не тянуть за собой лишние зависимости. Репозитории — ходить в БД предсказуемо, без сюрпризов в циклах.
Второй частый провал — работа с Doctrine. N+1, ленивые связи и выборка «на всякий случай» убивают производительность тихо и стабильно. Если сущность нужна только для чтения, не тащите её в объектный комбайн: иногда проще отдать DTO или массив нужных полей.
И ещё один момент: кэшируйте то, что реально дорого считать. Не всё подряд, а именно тяжёлые сборки конфигурации, меню, ACL, агрегаты. Symfony это позволяет без магии — вопрос только в дисциплине проекта.
Если приложение стало вязким, начинайте с архитектуры запросов, а не с замены фреймворка.
Чаще всего проблема не в самом ядре, а в том, как собран проект:
— в одном контейнере живут всё подряд: сервисы, конфиг, side effects;
— запросы к БД размазаны по контроллерам и шаблонам;
— лишняя логика попадает в Twig и крутится на каждом рендере.
Есть наблюдение которое стоит проверить: если у вас растёт время ответа, сначала смотрите не на «Symfony медленный», а на границы слоёв. Контроллер должен собирать данные, а не считать бизнес-логику. Сервисы — делать одну вещь и не тянуть за собой лишние зависимости. Репозитории — ходить в БД предсказуемо, без сюрпризов в циклах.
Второй частый провал — работа с Doctrine. N+1, ленивые связи и выборка «на всякий случай» убивают производительность тихо и стабильно. Если сущность нужна только для чтения, не тащите её в объектный комбайн: иногда проще отдать DTO или массив нужных полей.
И ещё один момент: кэшируйте то, что реально дорого считать. Не всё подряд, а именно тяжёлые сборки конфигурации, меню, ACL, агрегаты. Symfony это позволяет без магии — вопрос только в дисциплине проекта.
Если приложение стало вязким, начинайте с архитектуры запросов, а не с замены фреймворка.
Composer ломается не в пакете, а в том, как вы собираете проект
За багами с зависимостями почти всегда стоят три вещи: слишком широкий constraint, отсутствие lock-файла в коммите и ручные правки vendor. Composer не магия, а детерминированный сборщик: если входные данные плавают, на выходе получите разные деревья пакетов на разных машинах.
Смотрите на require как на контракт, а не как на просьбу. • Не ставьте "звёздочки" без причины • Для библиотек держите совместимость шире, для приложений — уже • После изменения зависимостей запускайте update осознанно, а не на автомате. И отдельно: composer.lock должен жить в репозитории приложения, иначе у команды будет несколько «рабочих» сборок одновременно.
Ещё два правила, которые спасают релизы: не смешивайте major-обновления с рефакторингом и проверяйте platform packages. Если у вас в CI один PHP, а на проде другой, Composer может собрать проект, который локально проходит, а на сервере падает. Туда же относится ext-* и конфликтующие пакеты: лучше увидеть проблему на install, чем в рантайме.
Финал простой: перед мерджем зависимостей смотрите не на список обновлений, а на diff lock-файла и на то, что реально изменилось в дереве пакетов.
За багами с зависимостями почти всегда стоят три вещи: слишком широкий constraint, отсутствие lock-файла в коммите и ручные правки vendor. Composer не магия, а детерминированный сборщик: если входные данные плавают, на выходе получите разные деревья пакетов на разных машинах.
Смотрите на require как на контракт, а не как на просьбу. • Не ставьте "звёздочки" без причины • Для библиотек держите совместимость шире, для приложений — уже • После изменения зависимостей запускайте update осознанно, а не на автомате. И отдельно: composer.lock должен жить в репозитории приложения, иначе у команды будет несколько «рабочих» сборок одновременно.
Ещё два правила, которые спасают релизы: не смешивайте major-обновления с рефакторингом и проверяйте platform packages. Если у вас в CI один PHP, а на проде другой, Composer может собрать проект, который локально проходит, а на сервере падает. Туда же относится ext-* и конфликтующие пакеты: лучше увидеть проблему на install, чем в рантайме.
Финал простой: перед мерджем зависимостей смотрите не на список обновлений, а на diff lock-файла и на то, что реально изменилось в дереве пакетов.
7 PHP-ошибок, которые незаметно ломают продакшн и отладку
Первая ловушка — смешивать бизнес-логику и работу с I/O в одном методе. Такой код сложно тестировать, а падение на внешнем сервисе маскирует реальную причину сбоя.
Вторая — полагаться на неявные преобразования типов. PHP многое «прощает», но потом это выстреливает в валидации, сравнениях и фильтрах. Сравнивай явно, особенно там, где участвуют строки, числа и `null`.
Третья — ловить `Exception` везде подряд и молча проглатывать ошибку. Если лог пустой, инцидент превращается в гадание. Минимум — контекст, максимум — отдельные типы ошибок и понятные сообщения.
Четвёртая — тащить в код массивы без формы. Когда структура не зафиксирована, баги прячутся в ключах, а не в логике. Для сложных данных лучше DTO, value objects или хотя бы строгие соглашения по полям.
Пятая — писать SQL/запросы так, будто N+1 «и так сойдёт». На локали всё быстро, в реальном трафике начинается деградация. Проверяй количество запросов и не делай лишнюю работу в циклах.
Если нужен базовый фильтр качества — ищи не «работает ли код», а «понятно ли, где он упадёт, и можно ли это быстро найти».
Первая ловушка — смешивать бизнес-логику и работу с I/O в одном методе. Такой код сложно тестировать, а падение на внешнем сервисе маскирует реальную причину сбоя.
Вторая — полагаться на неявные преобразования типов. PHP многое «прощает», но потом это выстреливает в валидации, сравнениях и фильтрах. Сравнивай явно, особенно там, где участвуют строки, числа и `null`.
Третья — ловить `Exception` везде подряд и молча проглатывать ошибку. Если лог пустой, инцидент превращается в гадание. Минимум — контекст, максимум — отдельные типы ошибок и понятные сообщения.
Четвёртая — тащить в код массивы без формы. Когда структура не зафиксирована, баги прячутся в ключах, а не в логике. Для сложных данных лучше DTO, value objects или хотя бы строгие соглашения по полям.
Пятая — писать SQL/запросы так, будто N+1 «и так сойдёт». На локали всё быстро, в реальном трафике начинается деградация. Проверяй количество запросов и не делай лишнюю работу в циклах.
Если нужен базовый фильтр качества — ищи не «работает ли код», а «понятно ли, где он упадёт, и можно ли это быстро найти».
This media is not supported in your browser
VIEW IN TELEGRAM
Как уходят из арбитража трафика: интервью с бывшим медиабайером
Интервью с арбитражником, который отработал в сфере с 2019 года и ушёл в другую профессию. Герой рассказывает о работе в Adcombo с тизерками, переходе в криптовертикаль и прямом выкупе трафика, а затем о причинах ухода: выгорание, сложности с поиском новой позиции и переоценка приоритетов. Статья развенчивает миф о лёгких деньгах в арбитраже — это обычная работа с высокими рисками, дефицитом информации и эмоциональным истощением. Выво…
➡️ Читайте на сайте: https://aff.top/blog/kak-ukhodiat-iz-arbitrazha-trafika-interviu-s-byvshim-mediabaierom
🧠 Ещё больше инсайтов → в канале AFF.top
Интервью с арбитражником, который отработал в сфере с 2019 года и ушёл в другую профессию. Герой рассказывает о работе в Adcombo с тизерками, переходе в криптовертикаль и прямом выкупе трафика, а затем о причинах ухода: выгорание, сложности с поиском новой позиции и переоценка приоритетов. Статья развенчивает миф о лёгких деньгах в арбитраже — это обычная работа с высокими рисками, дефицитом информации и эмоциональным истощением. Выво…
➡️ Читайте на сайте: https://aff.top/blog/kak-ukhodiat-iz-arbitrazha-trafika-interviu-s-byvshim-mediabaierom
🧠 Ещё больше инсайтов → в канале AFF.top
Livewire ломают не «магия PHP», а грязные границы между состоянием и UI
Если компонент начинает «сам решать» и валидацию, и загрузку данных, и рендер, и права доступа — он быстро превращается в мини-контроллер без структуры. Держите правило: один компонент = одна пользовательская задача. Всё, что относится к домену, выносите в сервисы, actions или query objects.
За этим обычно идут три проблемы:
— состояние хранится не там и не сбрасывается после действий;
— в шаблоне появляется лишняя логика, которую потом трудно тестировать;
— запросы в БД размножаются при каждом перерендере.
Отдельно следите за ключами в списках и вложенных компонентах. Если ключи плавают, Livewire начинает путать элементы, а вместе с ними — инпуты, ошибки валидации и временные значения. Ещё одна типовая ошибка — тащить в public-свойства тяжёлые модели вместо простых скаляров или DTO. Это раздувает сериализацию и делает компонент хрупким.
Хорошая практика простая: минимальный state, явные методы действий, вычисления — в отдельный слой, а UI-компоненту оставьте только сбор событий и вывод данных. Тогда Livewire остаётся быстрым, предсказуемым и нормально тестируется.
Если компонент начинает «сам решать» и валидацию, и загрузку данных, и рендер, и права доступа — он быстро превращается в мини-контроллер без структуры. Держите правило: один компонент = одна пользовательская задача. Всё, что относится к домену, выносите в сервисы, actions или query objects.
За этим обычно идут три проблемы:
— состояние хранится не там и не сбрасывается после действий;
— в шаблоне появляется лишняя логика, которую потом трудно тестировать;
— запросы в БД размножаются при каждом перерендере.
Отдельно следите за ключами в списках и вложенных компонентах. Если ключи плавают, Livewire начинает путать элементы, а вместе с ними — инпуты, ошибки валидации и временные значения. Ещё одна типовая ошибка — тащить в public-свойства тяжёлые модели вместо простых скаляров или DTO. Это раздувает сериализацию и делает компонент хрупким.
Хорошая практика простая: минимальный state, явные методы действий, вычисления — в отдельный слой, а UI-компоненту оставьте только сбор событий и вывод данных. Тогда Livewire остаётся быстрым, предсказуемым и нормально тестируется.
Composer ломается не в install, а в структуре проекта — 5 проверок перед запуском
Если пакет не ставится, сначала смотрят не на Composer, а на сам репозиторий: где лежит код, что объявлено в
—
— Если пакет — библиотека, проверь
— Для монорепы и локальной разработки не путай
— Конфликт версий часто сидит не в самом пакете, а в верхнеуровневом constraint: один жёсткий диапазон может заблокировать весь граф зависимостей.
— Если автозагрузка ведёт себя странно, первым делом проверь классы с одинаковыми именами, старые файлы в
Хорошая привычка — прогонять
Если пакет не ставится, сначала смотрят не на Composer, а на сам репозиторий: где лежит код, что объявлено в
autoload, есть ли конфликт имён и не сломан ли корень проекта.—
composer.json должен описывать один понятный вход: PSR-4, корректный namespace, без дублей в autoload и autoload-dev.— Если пакет — библиотека, проверь
type, require и extra: лишние зависимости тянут за собой мусор в конечный проект.— Для монорепы и локальной разработки не путай
path-репозитории с рабочей копией пакета: после правки не забывай пересобирать автозагрузку.— Конфликт версий часто сидит не в самом пакете, а в верхнеуровневом constraint: один жёсткий диапазон может заблокировать весь граф зависимостей.
— Если автозагрузка ведёт себя странно, первым делом проверь классы с одинаковыми именами, старые файлы в
vendor и кеши генерации.Хорошая привычка — прогонять
composer validate, затем composer dump-autoload, и только потом искать баг в коде.7 ошибок в Laravel-проектах, которые потом бьют по скорости, тестам и деплою
За неделю в репах чаще всего всплывает не «сложная архитектура», а одинаковые промахи: жирные контроллеры, бизнес-логика в шаблонах и сервисы, которые тянут за собой полприложения. В Laravel это особенно заметно, потому что фреймворк слишком легко позволяет «сделать быстро» и так же быстро накопить долг.
— Не тащите запросы в циклах: N+1 маскируется на маленьких данных и взрывается в проде.
— Не держите логику в FormRequest, Resource и Blade одновременно: один сценарий должен жить в одном слое.
— Не используйте фасады как повод не думать о зависимостях: тестировать такие места потом больно.
Есть наблюдение которое стоит проверить: если класс трудно назвать одним предложением, он уже делает слишком много. В Laravel это часто видно в сервисах на 500 строк, где смешаны валидация, доступ к БД, кеш и отправка уведомлений. Такой код почти невозможно безопасно рефакторить без регресса.
Практика простая: выносите операции в маленькие action-классы, для чтения данных используйте отдельные query-объекты или репозитории, а для внешних интеграций — тонкие адаптеры. Тогда PHPUnit покрывает поведение, а не угадывает намерения автора.
Если проект начинает «тормозить головой», сначала режьте связанность, потом уже ищите узкие места в SQL и кеше.
За неделю в репах чаще всего всплывает не «сложная архитектура», а одинаковые промахи: жирные контроллеры, бизнес-логика в шаблонах и сервисы, которые тянут за собой полприложения. В Laravel это особенно заметно, потому что фреймворк слишком легко позволяет «сделать быстро» и так же быстро накопить долг.
— Не тащите запросы в циклах: N+1 маскируется на маленьких данных и взрывается в проде.
— Не держите логику в FormRequest, Resource и Blade одновременно: один сценарий должен жить в одном слое.
— Не используйте фасады как повод не думать о зависимостях: тестировать такие места потом больно.
Есть наблюдение которое стоит проверить: если класс трудно назвать одним предложением, он уже делает слишком много. В Laravel это часто видно в сервисах на 500 строк, где смешаны валидация, доступ к БД, кеш и отправка уведомлений. Такой код почти невозможно безопасно рефакторить без регресса.
Практика простая: выносите операции в маленькие action-классы, для чтения данных используйте отдельные query-объекты или репозитории, а для внешних интеграций — тонкие адаптеры. Тогда PHPUnit покрывает поведение, а не угадывает намерения автора.
Если проект начинает «тормозить головой», сначала режьте связанность, потом уже ищите узкие места в SQL и кеше.
This media is not supported in your browser
VIEW IN TELEGRAM
ByteDance анонсировала новую версию SeeDance версии 2.5
ByteDance готовит релиз Seedance 2.5 — видеогенератора нового уровня. Главное улучшение: модель сможет создавать 30-секундные видео за один прогон без склеек, вместо нынешних 15 секунд. Добавили локальный монтаж отдельных кадров, поддержку 3D-болванок для управления камерой, возможность использовать до 50 референсов и генерацию в 4К сразу. Закрытый бета-тест идёт сейчас, открытый релиз ожидается в начале июля. Технологически это шаг вперёд, но д…
➡️ Читайте на сайте: https://aff.top/blog/bytedance-anonsirovala-novuiu-versiiu-seedance-versii-2-5
🧠 Ещё больше инсайтов → в канале AFF.top
ByteDance готовит релиз Seedance 2.5 — видеогенератора нового уровня. Главное улучшение: модель сможет создавать 30-секундные видео за один прогон без склеек, вместо нынешних 15 секунд. Добавили локальный монтаж отдельных кадров, поддержку 3D-болванок для управления камерой, возможность использовать до 50 референсов и генерацию в 4К сразу. Закрытый бета-тест идёт сейчас, открытый релиз ожидается в начале июля. Технологически это шаг вперёд, но д…
➡️ Читайте на сайте: https://aff.top/blog/bytedance-anonsirovala-novuiu-versiiu-seedance-versii-2-5
🧠 Ещё больше инсайтов → в канале AFF.top
This media is not supported in your browser
VIEW IN TELEGRAM
Codex уничтожит твой SSD за год
Разработчик обнаружил критический баг в Codex CLI от OpenAI: агент непрерывно записывает логи в локальную SQLite-базу, перезаписывая за 21 день 37 ТБ данных. При таком темпе типичный SSD объёмом 1 ТБ (рассчитанный на 600 ТБ перезаписей) выходит из строя менее чем за год. OpenAI осведомлена о проблеме, но пока не исправляет её. Пользователям остаётся либо ждать обновления, либо переключиться на альтернативные CLI-инструменты без подобных недостат…
➡️ Читайте на сайте: https://aff.top/blog/codex-unichtozhit-tvoi-ssd-za-god
🧠 Ещё больше инсайтов → в канале AFF.top
Разработчик обнаружил критический баг в Codex CLI от OpenAI: агент непрерывно записывает логи в локальную SQLite-базу, перезаписывая за 21 день 37 ТБ данных. При таком темпе типичный SSD объёмом 1 ТБ (рассчитанный на 600 ТБ перезаписей) выходит из строя менее чем за год. OpenAI осведомлена о проблеме, но пока не исправляет её. Пользователям остаётся либо ждать обновления, либо переключиться на альтернативные CLI-инструменты без подобных недостат…
➡️ Читайте на сайте: https://aff.top/blog/codex-unichtozhit-tvoi-ssd-za-god
🧠 Ещё больше инсайтов → в канале AFF.top
5 PHPUnit-проверок, которые экономят часы дебага в PHP-проекте
PHPUnit часто используют как «проверку на зелёную кнопку», но его ценность — в защите бизнес-логики от тихих поломок. Особенно там, где код трогает скидки, статусы, права доступа и интеграции.
— Тестируйте не только happy path. Ошибки, пустые входные данные, неверные статусы и запрещённые переходы ломают продукт чаще, чем «идеальный» сценарий.
— Проверяйте границы: ноль, пустую строку, null, длинный массив, дубликаты. Именно на границах прячутся баги, которые потом выглядят как «магия».
— Изолируйте внешние зависимости: HTTP, очередь, почта, файловая система, время. В тесте должен быть контроль, а не надежда на стабильность окружения.
— Ставьте осмысленные названия тестам: не `testSomething()`, а поведение в стиле `it_blocks_payment_for_expired_order`. Такой тест проще читать и чинить.
— Не дублируйте логику прод-кода в ассертах. Если в тесте повторяется тот же алгоритм, он перестаёт ловить регрессии и начинает подтверждать собственную ошибку.
Ещё одна полезная привычка — держать отдельные тесты для моделей, сервисов и критичных сценариев. Когда тест маленький и точный, он живёт долго и не превращается в хрупкий шум.
PHPUnit часто используют как «проверку на зелёную кнопку», но его ценность — в защите бизнес-логики от тихих поломок. Особенно там, где код трогает скидки, статусы, права доступа и интеграции.
— Тестируйте не только happy path. Ошибки, пустые входные данные, неверные статусы и запрещённые переходы ломают продукт чаще, чем «идеальный» сценарий.
— Проверяйте границы: ноль, пустую строку, null, длинный массив, дубликаты. Именно на границах прячутся баги, которые потом выглядят как «магия».
— Изолируйте внешние зависимости: HTTP, очередь, почта, файловая система, время. В тесте должен быть контроль, а не надежда на стабильность окружения.
— Ставьте осмысленные названия тестам: не `testSomething()`, а поведение в стиле `it_blocks_payment_for_expired_order`. Такой тест проще читать и чинить.
— Не дублируйте логику прод-кода в ассертах. Если в тесте повторяется тот же алгоритм, он перестаёт ловить регрессии и начинает подтверждать собственную ошибку.
Ещё одна полезная привычка — держать отдельные тесты для моделей, сервисов и критичных сценариев. Когда тест маленький и точный, он живёт долго и не превращается в хрупкий шум.
Spatie — пакетная экосистема, которую в проекте часто недооценивают до первого хаоса
У Spatie сильная сторона не в одном «магическом» пакете, а в наборе мелких решений, которые снимают рутину: permissions, media library, activity log, data transfer objects, backup, sitemap, ray-интеграции. Если держите Laravel-проект с админкой, CRM или внутренним сервисом, сначала смотрите не на кастом, а на то, есть ли у Spatie уже готовый кирпич.
Правило отбора простое:
— пакет должен закрывать типовую задачу без лишней магии;
— API должно читаться через код, а не через полдня в документации;
— модель расширения важнее «быстро завелось»;
— если пакет лезет в много мест приложения, проверьте, как он ведет себя в тестах и при обновлениях.
Главная ошибка — тащить Spatie как набор разрозненных зависимостей без единого подхода. Тогда появляются разные способы хранения настроек, разные модели прав, разный стиль событий и очередей. Лучше заранее договориться: где лежат конфиги, кто владеет миграциями, как вы пишете обертки над фасадами, и какие части пакета вообще разрешено использовать в доменной логике.
Еще одна полезная привычка — смотреть на пакеты Spatie как на слой инфраструктуры, а не как на замену архитектуре. Они хорошо работают, когда вы хотите сократить число самописных сервисов и оставить в проекте только то, что реально отличает ваш продукт от остальных.
Если пакет экономит время сейчас, но делает проект хрупким через полгода, это не ускорение, а долг. Выбирайте Spatie там, где он убирает повторяющийся код и не мешает вашему доменному ядру.
У Spatie сильная сторона не в одном «магическом» пакете, а в наборе мелких решений, которые снимают рутину: permissions, media library, activity log, data transfer objects, backup, sitemap, ray-интеграции. Если держите Laravel-проект с админкой, CRM или внутренним сервисом, сначала смотрите не на кастом, а на то, есть ли у Spatie уже готовый кирпич.
Правило отбора простое:
— пакет должен закрывать типовую задачу без лишней магии;
— API должно читаться через код, а не через полдня в документации;
— модель расширения важнее «быстро завелось»;
— если пакет лезет в много мест приложения, проверьте, как он ведет себя в тестах и при обновлениях.
Главная ошибка — тащить Spatie как набор разрозненных зависимостей без единого подхода. Тогда появляются разные способы хранения настроек, разные модели прав, разный стиль событий и очередей. Лучше заранее договориться: где лежат конфиги, кто владеет миграциями, как вы пишете обертки над фасадами, и какие части пакета вообще разрешено использовать в доменной логике.
Еще одна полезная привычка — смотреть на пакеты Spatie как на слой инфраструктуры, а не как на замену архитектуре. Они хорошо работают, когда вы хотите сократить число самописных сервисов и оставить в проекте только то, что реально отличает ваш продукт от остальных.
Если пакет экономит время сейчас, но делает проект хрупким через полгода, это не ускорение, а долг. Выбирайте Spatie там, где он убирает повторяющийся код и не мешает вашему доменному ядру.
Composer ломается не в install, а в неверной структуре пакета и зависимостей
Если Composer ведёт себя странно, проблема часто не в нём, а в метаданных пакета. Проверь первым делом:
—
— PSR-4: путь и namespace должны совпадать без «почти»
—
Для рабочей установки важнее не «поставилось», а чтобы граф зависимостей был предсказуемым. Если пакет требует слишком широкий диапазон версий, он начнёт конфликтовать не сразу, а на следующем апгрейде соседнего модуля.
Проверяй не только root-проект, но и то, что утащит твой пакет в чужой код:
— не переопределяй без нужды общие библиотеки
— не тащи в production лишние dev-required зависимости
— следи за автозагрузкой файлов и classmap, если пакет старый или нестандартный
Ещё одна типовая ошибка — обновлять всё подряд без фиксации границ. Для проекта полезнее короткая дисциплина: сначала
Если держать пакет чистым на уровне метаданных, Composer становится скучным — а это лучший режим для деплоя.
Если Composer ведёт себя странно, проблема часто не в нём, а в метаданных пакета. Проверь первым делом:
—
composer.json: имя, тип, лицензия, autoload, require и conflicts— PSR-4: путь и namespace должны совпадать без «почти»
—
minimum-stability и prefer-stable: не загоняй проект в случайные dev-зависимостиДля рабочей установки важнее не «поставилось», а чтобы граф зависимостей был предсказуемым. Если пакет требует слишком широкий диапазон версий, он начнёт конфликтовать не сразу, а на следующем апгрейде соседнего модуля.
Проверяй не только root-проект, но и то, что утащит твой пакет в чужой код:
— не переопределяй без нужды общие библиотеки
— не тащи в production лишние dev-required зависимости
— следи за автозагрузкой файлов и classmap, если пакет старый или нестандартный
Ещё одна типовая ошибка — обновлять всё подряд без фиксации границ. Для проекта полезнее короткая дисциплина: сначала
composer validate, потом composer why и composer why-not, и только после этого правки в зависимостях.Если держать пакет чистым на уровне метаданных, Composer становится скучным — а это лучший режим для деплоя.
This media is not supported in your browser
VIEW IN TELEGRAM
Google ужесточает модерацию финансовой вертикали
Google ужесточает модерацию финансовых офферов в ЕС и ЕЭЗ, введя двухэтапную верификацию через G2 Risk Solutions и Google Ads. Проверка затронет 24 страны, включая Австрию, Польшу, Нидерланды и другие члены союза. На прохождение модерации отводится 30 дней — за это время некоторые связки успеют отработать до вступления требований в силу. Для арбитражников это означает необходимость подготовиться к усложнению процесса запуска финансовых кампаний …
➡️ Читайте на сайте: https://aff.top/blog/google-uzhestochaet-moderaciiu-finansovoi-vertikali
🧠 Ещё больше инсайтов → в канале AFF.top
Google ужесточает модерацию финансовых офферов в ЕС и ЕЭЗ, введя двухэтапную верификацию через G2 Risk Solutions и Google Ads. Проверка затронет 24 страны, включая Австрию, Польшу, Нидерланды и другие члены союза. На прохождение модерации отводится 30 дней — за это время некоторые связки успеют отработать до вступления требований в силу. Для арбитражников это означает необходимость подготовиться к усложнению процесса запуска финансовых кампаний …
➡️ Читайте на сайте: https://aff.top/blog/google-uzhestochaet-moderaciiu-finansovoi-vertikali
🧠 Ещё больше инсайтов → в канале AFF.top
Composer ломает проект не из-за пакетов, а из-за того, как им пользуются
В Laravel/PHP-стеке Composer — не просто «установщик зависимостей», а точка, где фиксируется весь контракт проекта: версии, автозагрузка, платформенные ограничения и поведение скриптов.
Если нужен стабильный репозиторий, проверьте базовые вещи:
— lock-файл должен жить в VCS;
— диапазоны версий в composer.json не должны быть слишком широкими;
— platform.php помогает не поставить пакет, который не поедет на сервере;
— scripts и post-install команды не должны прятать бизнес-логику.
Частая ошибка — тянуть всё через dev-master и потом удивляться, почему на соседнем окружении проект ведёт себя иначе. Вторая — ставить пакет «на глаз», не глядя в его зависимости: один конфликт по symfony/polyfill или psr/container способен разнести весь граф.
Для командной работы полезно держать отдельный ритуал: обновление зависимостей делается через pull request, а не вручную на боевом сервере. Тогда можно увидеть, кто именно принёс изменение в дерево пакетов, и быстро откатить проблему.
Если Composer у вас работает только как install, проект уже живёт в зоне риска. Нормальная дисциплина — это lock, контроль платформы и регулярная проверка дерева зависимостей перед тем, как код попадёт дальше по пайплайну.
В Laravel/PHP-стеке Composer — не просто «установщик зависимостей», а точка, где фиксируется весь контракт проекта: версии, автозагрузка, платформенные ограничения и поведение скриптов.
Если нужен стабильный репозиторий, проверьте базовые вещи:
— lock-файл должен жить в VCS;
— диапазоны версий в composer.json не должны быть слишком широкими;
— platform.php помогает не поставить пакет, который не поедет на сервере;
— scripts и post-install команды не должны прятать бизнес-логику.
Частая ошибка — тянуть всё через dev-master и потом удивляться, почему на соседнем окружении проект ведёт себя иначе. Вторая — ставить пакет «на глаз», не глядя в его зависимости: один конфликт по symfony/polyfill или psr/container способен разнести весь граф.
Для командной работы полезно держать отдельный ритуал: обновление зависимостей делается через pull request, а не вручную на боевом сервере. Тогда можно увидеть, кто именно принёс изменение в дерево пакетов, и быстро откатить проблему.
Если Composer у вас работает только как install, проект уже живёт в зоне риска. Нормальная дисциплина — это lock, контроль платформы и регулярная проверка дерева зависимостей перед тем, как код попадёт дальше по пайплайну.