This media is not supported in your browser
VIEW IN TELEGRAM
В DeepSeek добавили распознавание изображений
DeepSeek запустил бета-версию распознавания изображений — функция доступна бесплатно прямо в чате. Работает нестабильно, но для базовых задач подходит: например, проверить, есть ли на креативе узнаваемая знаменитость в нужном гео. Платная подписка не нужна.
➡️ Читайте на сайте: https://aff.top/blog/v-deepseek-dobavili-raspoznavanie-izobrazhenii
🧠 Ещё больше инсайтов → в канале AFF.top
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
Разбираем новости из мира ИИ, тренды вайб-кодинга, инсайды индустрии арбитража — без воды и продаж курсов.
👉 Подписаться на канал AFF.TOP
Почему PHPUnit ломает доверие к тестам чаще, чем сам код
Есть наблюдение которое стоит проверить: тесты начинают врать не из-за фреймворка, а из-за привычек команды.
— Сначала ловят только happy path и забывают про границы: пустые значения, null, дубли, неверные статусы.
— Потом прячут логику в моки: тест проходит, а реальная интеграция с сервисом уже рассыпается.
— Затем делают один большой тест на всё: он медленный, хрупкий и не показывает, где именно сломалось.
Рабочий подход проще: тестируй поведение, а не внутренности; выноси в отдельные кейсы правила валидации, авторизации и расчётов; моки используй только там, где внешний мир реально мешает. Если тест зависит от случайности, времени или порядка выполнения — он уже кандидат на переписывание 🧪
Ещё один фильтр качества: тест должен отвечать на вопрос «что сломается для пользователя», а не «какой метод вызвался первым». Когда это правило нарушают, тестовый набор разрастается, но уверенности не добавляет.
Сначала очисти тесты от лишних зависимостей, потом добейся коротких и именованных сценариев — именно они переживают и рефакторинг, и смену команды.
Есть наблюдение которое стоит проверить: тесты начинают врать не из-за фреймворка, а из-за привычек команды.
— Сначала ловят только happy path и забывают про границы: пустые значения, null, дубли, неверные статусы.
— Потом прячут логику в моки: тест проходит, а реальная интеграция с сервисом уже рассыпается.
— Затем делают один большой тест на всё: он медленный, хрупкий и не показывает, где именно сломалось.
Рабочий подход проще: тестируй поведение, а не внутренности; выноси в отдельные кейсы правила валидации, авторизации и расчётов; моки используй только там, где внешний мир реально мешает. Если тест зависит от случайности, времени или порядка выполнения — он уже кандидат на переписывание 🧪
Ещё один фильтр качества: тест должен отвечать на вопрос «что сломается для пользователя», а не «какой метод вызвался первым». Когда это правило нарушают, тестовый набор разрастается, но уверенности не добавляет.
Сначала очисти тесты от лишних зависимостей, потом добейся коротких и именованных сценариев — именно они переживают и рефакторинг, и смену команды.
7 признаков, что PHP-пакет лучше не тянуть в прод, даже если он «популярен»
Есть наблюдение которое стоит проверить: у многих инцидентов причина не в Laravel или Symfony, а в одном сомнительном пакете из Composer.
— Нет тестов под свои кейсы. Если пакет покрывает только happy path, вы оплачиваете будущий баг своим продом.
— Слишком много магии. Хелперы, глобальные состояния, автоконфиг «сам всё подхватит» — потом сложно понять, где сломалось.
— Нет явного контракта API. Если названия методов, типы и поведение читаются только через исходники, интеграция будет хрупкой.
— Репозиторий живёт, но не дышит: issue закрываются без объяснений, PR висят, README обещает больше, чем код.
— Пакет тянет лишние зависимости. Для трекера, CRM или арбитражной обвязки это быстро превращается в конфликт версий и лишний вес.
— Нет стратегии совместимости. Если автор меняет поведение без миграций и deprecation-цикла, обновление всегда лотерея.
Перед установкой проверьте три вещи: лицензия, качество тестов, состав зависимостей. И ещё одно: можно ли заменить пакет тонким адаптером вокруг своего кода.
Если пакет не объясняет свои границы — лучше не делать его центром архитектуры.
Есть наблюдение которое стоит проверить: у многих инцидентов причина не в 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
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-файле, тем меньше сюрпризов в проде.
Если в проекте 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
Арбитражник про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