⌨️ Топ-вакансий по PHP за неделю
PHP-разработчик — удалёнка/гибрид (Москва) — Гринсайт
PHP-разработчик (Laravel) — офис (Калининград) — ЖилиБыли
Tech Lead (PHP / Laravel) — 3 500 - 4 700 $ — удалёнка — Global Trads
➡️ Еще больше топовых вакансий — в нашем канале PHP Jobs
PHP-разработчик — удалёнка/гибрид (Москва) — Гринсайт
PHP-разработчик (Laravel) — офис (Калининград) — ЖилиБыли
Tech Lead (PHP / Laravel) — 3 500 - 4 700 $ — удалёнка — Global Trads
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍1🔥1
⚠️ Уже завтра стартует курс AgentOps!
Мы собрали на потоке сборную из мастеров IT-рынка. Практики из BigTech научат вас контролировать и отлаживать ИИ-агентов, чтобы они работали предсказуемо и не сливали бюджет на API.
🔥 Заберите 3 курса по цене 1:
Хотите прокачать свое портфолио продакшн-кейсом, но пока сомневаетесь? Пройдите наш бесплатный демо-урок, чтобы протестировать формат перед покупкой.
👉 Забрать 3 курса по цене 1 и получить демо-урок
Мы собрали на потоке сборную из мастеров IT-рынка. Практики из BigTech научат вас контролировать и отлаживать ИИ-агентов, чтобы они работали предсказуемо и не сливали бюджет на API.
🔥 Заберите 3 курса по цене 1:
● При покупке VIP-тарифа (осталось 4 места) нового потока «Разработка ИИ-агентов» получаете в подарок курс «AgentOps» + ещё один любой курс Академии (например, «Математика для разработки AI», чтобы глубже освоить направление).
● Три курса обойдутся вам всего в 134.000 ₽ вместо 263.000 ₽.
● Доступна удобная беспроцентная рассрочка, платеж можно разбить на несколько комфортных частей.
Хотите прокачать свое портфолио продакшн-кейсом, но пока сомневаетесь? Пройдите наш бесплатный демо-урок, чтобы протестировать формат перед покупкой.
👉 Забрать 3 курса по цене 1 и получить демо-урок
❤1😁1
ОПРОС: Ответьте на пару вопросов и получите промокод на все наши курсы! 🎁
Команда Prоglib.аcаdemy готовит к запуску новые продукты, и нам нужна ваша помощь. Мы хотим создавать обучение, которое будет решать ваши реальные карьерные задачи и бить точно в цель.
Поделитесь своим опытом и ожиданиями, чтобы мы сделали наши курсы еще полезнее именно для вас! Заполнение анкеты займет буквально 2–3 минуты, а с нас — скидка на любой наш курс!
👉 Пройти опрос в Яндекс Формах и забрать промокод
Команда Prоglib.аcаdemy готовит к запуску новые продукты, и нам нужна ваша помощь. Мы хотим создавать обучение, которое будет решать ваши реальные карьерные задачи и бить точно в цель.
Поделитесь своим опытом и ожиданиями, чтобы мы сделали наши курсы еще полезнее именно для вас! Заполнение анкеты займет буквально 2–3 минуты, а с нас — скидка на любой наш курс!
👉 Пройти опрос в Яндекс Формах и забрать промокод
📊 UUID vs автоинкремент в качестве первичного ключа
Спор древний, но решается не вкусовщиной, а тем, кто и когда генерирует ключ.
🔹 Автоинкремент хорош, когда:
— Ключ нужен только внутри одной БД
— Важна плотная индексация и предсказуемый порядок вставки (B-tree счастлив)
— Не страшно, что /users/42 выдаёт размер таблицы наружу
🔹 UUID (а лучше UUIDv7) уместен, когда:
— ID нужно сгенерировать на клиенте/в другом сервисе до записи в БД
— Идёт шардирование или слияние данных из нескольких источников
— Последовательный ID — это утечка бизнес-метрики
⚠️ Частая ловушка
Случайный UUIDv4 как кластерный ключ в InnoDB. Вставки идут вразнобой по индексу → фрагментация страниц, распухание, просадка на записи. Именно поэтому появился UUIDv7, он временно-упорядоченный, ложится в индекс почти как автоинкремент, но остаётся глобально уникальным.
Практичный компромисс: автоинкремент как внутренний PK + UUIDv7 как публичный идентификатор в URL и API. Внутри — быстро, наружу — безопасно.
Спор древний, но решается не вкусовщиной, а тем, кто и когда генерирует ключ.
🔹 Автоинкремент хорош, когда:
— Ключ нужен только внутри одной БД
— Важна плотная индексация и предсказуемый порядок вставки (B-tree счастлив)
— Не страшно, что /users/42 выдаёт размер таблицы наружу
🔹 UUID (а лучше UUIDv7) уместен, когда:
— ID нужно сгенерировать на клиенте/в другом сервисе до записи в БД
— Идёт шардирование или слияние данных из нескольких источников
— Последовательный ID — это утечка бизнес-метрики
Случайный UUIDv4 как кластерный ключ в InnoDB. Вставки идут вразнобой по индексу → фрагментация страниц, распухание, просадка на записи. Именно поэтому появился UUIDv7, он временно-упорядоченный, ложится в индекс почти как автоинкремент, но остаётся глобально уникальным.
Практичный компромисс: автоинкремент как внутренний PK + UUIDv7 как публичный идентификатор в URL и API. Внутри — быстро, наружу — безопасно.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥3❤2👏1
This media is not supported in your browser
VIEW IN TELEGRAM
📹 Что должен делать агент-оркестратор?
Посмотрите короткий отрывок из вебинара с Дмитрием Юдиным, внутри концентрат инсайтов о ии-агентах. А если хотите погрузиться в тему с головой, у нас доступна и полная запись этого эфира.
Готовы перейти от теории к практике и собрать свой первый продакшн-кейс?
Прямо сейчас действует мощная акция «3 курса по цене 1»:
🔥 При покупке VIP-тарифа нового потока «Разработка ИИ-агентов» вы получаете в подарок хардкорный курс «AgentOps» + ещё один любой курс Академии на ваш выбор!
Выгода в цифрах: два топовых курса по созданию и контролю агентов обойдутся вам всего в 134.000 ₽ вместо 263.000 ₽. Плюс третий курс бонусом (например, можно подтянуть математику для AI). Ваша чистая экономия —129 000 ₽!
Сомневаетесь, подойдет ли вам формат? Оставьте заявку и пройдите бесплатный демо-урок, чтобы протестировать платформу перед покупкой.
👉 Пройти демо-урок и забрать 3 курса по цене 1
Посмотрите короткий отрывок из вебинара с Дмитрием Юдиным, внутри концентрат инсайтов о ии-агентах. А если хотите погрузиться в тему с головой, у нас доступна и полная запись этого эфира.
Готовы перейти от теории к практике и собрать свой первый продакшн-кейс?
Прямо сейчас действует мощная акция «3 курса по цене 1»:
🔥 При покупке VIP-тарифа нового потока «Разработка ИИ-агентов» вы получаете в подарок хардкорный курс «AgentOps» + ещё один любой курс Академии на ваш выбор!
Выгода в цифрах: два топовых курса по созданию и контролю агентов обойдутся вам всего в 134.000 ₽ вместо 263.000 ₽. Плюс третий курс бонусом (например, можно подтянуть математику для AI). Ваша чистая экономия —
Сомневаетесь, подойдет ли вам формат? Оставьте заявку и пройдите бесплатный демо-урок, чтобы протестировать платформу перед покупкой.
👉 Пройти демо-урок и забрать 3 курса по цене 1
⚙️ Pest
Элегантный фреймворк для тестирования, специально разработанный, чтобы вернуть удовольствие в процесс написания тестов. Фокусируется на простоте и читаемости кода.
Pest использует минимальный, понятный синтаксис и позволяет писать тесты с фокусом на то, что действительно важно — логику приложения. Отличается прогрессивным подходом: вы можете постепенно переходить с PHPUnit, без необходимости переписывать все тесты с нуля. Поддерживает параллельное выполнение тестов, browser testing с Playwright, и интеграцию со всеми популярными CI/CD платформами.
🔗 GitHub · Документация
Библиотека пхпшника
Элегантный фреймворк для тестирования, специально разработанный, чтобы вернуть удовольствие в процесс написания тестов. Фокусируется на простоте и читаемости кода.
Pest использует минимальный, понятный синтаксис и позволяет писать тесты с фокусом на то, что действительно важно — логику приложения. Отличается прогрессивным подходом: вы можете постепенно переходить с PHPUnit, без необходимости переписывать все тесты с нуля. Поддерживает параллельное выполнение тестов, browser testing с Playwright, и интеграцию со всеми популярными CI/CD платформами.
Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6😁5🔥2🌚2👏1
🎬 Как ИИ ускоряет разработку и где ломаются архитектуры
Мы провели открытый вебинар, где разобрали реальные боли проектирования автономных систем. Ольга Лукьянова на практическом кейсе показала, как использовать ИИ-ассистентов для реальных задач. Вы просили запись встречи — она уже в открытом доступе!
Что внутри:
— Как с помощью ИИ быстрее разбираться в незнакомом коде и готовить пулл-реквесты;
— Критерии выбора между одним агентом и мультиагентной системой;
— Разбор популярных архитектурных ошибок и ограничений современных ИИ;
— Практические рекомендации по проектированию и внедрению облачных агентов.
👉 Посмотреть полную запись можно тут:
● VK
● YouTube
🚀 Хотите пойти дальше открытого вебинара? Если вы готовы перейти от простых промптов к проектированию надежных, отказоустойчивых ИИ-систем, которые не сливают бюджет компании на API, приходите на курс AgentOps. Поток уже стартовал, но двери еще приоткрыты!
👉 Успеть на курс AgentOps
Мы провели открытый вебинар, где разобрали реальные боли проектирования автономных систем. Ольга Лукьянова на практическом кейсе показала, как использовать ИИ-ассистентов для реальных задач. Вы просили запись встречи — она уже в открытом доступе!
Что внутри:
— Как с помощью ИИ быстрее разбираться в незнакомом коде и готовить пулл-реквесты;
— Критерии выбора между одним агентом и мультиагентной системой;
— Разбор популярных архитектурных ошибок и ограничений современных ИИ;
— Практические рекомендации по проектированию и внедрению облачных агентов.
👉 Посмотреть полную запись можно тут:
● VK
● YouTube
🚀 Хотите пойти дальше открытого вебинара? Если вы готовы перейти от простых промптов к проектированию надежных, отказоустойчивых ИИ-систем, которые не сливают бюджет компании на API, приходите на курс AgentOps. Поток уже стартовал, но двери еще приоткрыты!
👉 Успеть на курс AgentOps
❤1
Forwarded from Библиотека собеса по PHP | вопросы с собеседований
Превью комментария обрывается на половине эмодзи. А валидация то пропускает мусор, то режет нормальный текст 👇
📦 Задание
Сервис отзывов. Комментарий — VARCHAR(255) (255 символов в utf8mb4). Валидатор ограничивает длину, сервис делает короткое превью для карточки. Полгода всё работало, пока аудитория была русскоязычной с короткими текстами. После запуска в новых регионах посыпались жалобы: эмодзи и иероглифы в превью превращаются в ?, а форма то ругается на короткий текст, то молча режет данные при сохранении.
// src/Comment/CommentValidator.php
class CommentValidator
{
private const MAX_LENGTH = 255;
public function validate(string $text): void
{
if (strlen($text) > self::MAX_LENGTH) {
throw new ValidationException('Слишком длинный комментарий');
}
}
}
// src/Comment/CommentPreview.php
class CommentPreview
{
public function make(string $text): string
{
if (strlen($text) <= 100) {
return $text;
}
return substr($text, 0, 100) . '…';
}
}
🔹 Задачи
— Объяснить, почему эмодзи/иероглифы в превью бьются в «кракозябры»
— Объяснить, почему один и тот же текст то проходит валидацию, то нет, и как это расходится с лимитом колонки в БД
— Исправить и валидатор, и превью
Ставьте → 🔥 если нравится формат. Если нет → 🌚
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7❤2👍1
🙈 Shared-nothing был киллер-фичей PHP. А мы его выкидываем, чтобы косплеить Node.js.
Двадцать лет «PHP в проде» означало одно: процесс на запрос, чистая таблица символов, в конце всё уничтожается. Никаких утечек, никакого состояния, любой стажёр не уронит прод глобалом.
Теперь модно иначе. FrankenPHP worker mode, RoadRunner, Swoole — держим приложение в памяти, экономим на бутстрапе, гоним 15k rps вместо 4k. Красиво в бенчмарках. А в реальности worker mode просто включает обратно все баги, от которых shared-nothing нас защищал. Статики, синглтоны, живые коннекты, $_SESSION, забытый static $cache в вендоре — теперь это не безобидный код, а мина между запросами разных юзеров.
Мы поменяли модель, где невозможно накосячить с состоянием, на модель, где косячить с состоянием — норма, просто «будьте аккуратнее».
💬 Где для вас граница? Воркеры — это зрелая эволюция или мы дружно ломаем главное преимущество языка ради цифры, которую видит только wrk?
Двадцать лет «PHP в проде» означало одно: процесс на запрос, чистая таблица символов, в конце всё уничтожается. Никаких утечек, никакого состояния, любой стажёр не уронит прод глобалом.
Теперь модно иначе. FrankenPHP worker mode, RoadRunner, Swoole — держим приложение в памяти, экономим на бутстрапе, гоним 15k rps вместо 4k. Красиво в бенчмарках. А в реальности worker mode просто включает обратно все баги, от которых shared-nothing нас защищал. Статики, синглтоны, живые коннекты, $_SESSION, забытый static $cache в вендоре — теперь это не безобидный код, а мина между запросами разных юзеров.
Мы поменяли модель, где невозможно накосячить с состоянием, на модель, где косячить с состоянием — норма, просто «будьте аккуратнее».
Please open Telegram to view this post
VIEW IN TELEGRAM
😁12👍5👏1🤔1
🔧 Работа с kubectl
Под рестартится каждые 5 минут, а kubectl logs показывает только текущий инстанс? Добавьте --previous, и вы увидите логи предыдущего упавшего контейнера — именно там обычно лежит причина крэша.
🔹 Зачем это нужно
— При CrashLoopBackOff текущий контейнер пустой, он только стартовал и ещё ничего не записал.
— Логи предыдущего контейнера хранятся до следующего рестарта, окно для отладки есть.
— Без этого флага вы буквально смотрите не туда.
🔹 Как использовать
— Логи предыдущего контейнера:
— Конкретный контейнер в мультиконтейнерном поде:
— Последние 50 строк:
— Следить за логами в реальном времени:
— Логи всех подов деплоймента сразу:
Под рестартится каждые 5 минут, а kubectl logs показывает только текущий инстанс? Добавьте --previous, и вы увидите логи предыдущего упавшего контейнера — именно там обычно лежит причина крэша.
🔹 Зачем это нужно
— При CrashLoopBackOff текущий контейнер пустой, он только стартовал и ещё ничего не записал.
— Логи предыдущего контейнера хранятся до следующего рестарта, окно для отладки есть.
— Без этого флага вы буквально смотрите не туда.
🔹 Как использовать
— Логи предыдущего контейнера:
kubectl logs pod-name --previous— Конкретный контейнер в мультиконтейнерном поде:
kubectl logs pod-name -c sidecar --previous— Последние 50 строк:
kubectl logs pod-name --previous --tail=50— Следить за логами в реальном времени:
kubectl logs -f pod-name— Логи всех подов деплоймента сразу:
kubectl logs deploy/my-app --all-containers👍2🔥1👏1
🔥 Открытое занятие по AgentOps — курс стартовал!
Сегодня в 19:00 по МСК пройдет первое занятие нового потока, на которое может прийти каждый. Оцените пользу нашего подхода на ретрансляции урока в VK!
👨💻 Спикер: Андрей Носов
Тема: Архитектура управления: state machine для AI-агентов
Будем разбираться, как использовать State machine в качестве главного оружия против стохастики (непредсказуемости) LLM.
Что в программе:
● State machine: инварианты и терминальные состояния;
● Паттерны маршрутизации: Supervisor, ReAct, Plan-and-Solve;
● Детекция циклов и настройка аварийных выходов;
● Абстракция от модели: как сделать каркас, который переживет смену LLM/провайдера;
● Адаптация графов под ограничения локальных моделей;
● Версионирование графов и миграции стейта.
Результат занятия: Вы поймете, как спроектировать надежный каркас агента с жестким контролем исполнения и переходов.
👉 Подписывайтесь на нашу группу ВКонтакте, чтобы не пропустить старт трансляции!
Сегодня в 19:00 по МСК пройдет первое занятие нового потока, на которое может прийти каждый. Оцените пользу нашего подхода на ретрансляции урока в VK!
👨💻 Спикер: Андрей Носов
Тема: Архитектура управления: state machine для AI-агентов
Будем разбираться, как использовать State machine в качестве главного оружия против стохастики (непредсказуемости) LLM.
Что в программе:
● State machine: инварианты и терминальные состояния;
● Паттерны маршрутизации: Supervisor, ReAct, Plan-and-Solve;
● Детекция циклов и настройка аварийных выходов;
● Абстракция от модели: как сделать каркас, который переживет смену LLM/провайдера;
● Адаптация графов под ограничения локальных моделей;
● Версионирование графов и миграции стейта.
Результат занятия: Вы поймете, как спроектировать надежный каркас агента с жестким контролем исполнения и переходов.
👉 Подписывайтесь на нашу группу ВКонтакте, чтобы не пропустить старт трансляции!
🔥 Открытое занятие по AgentOps — курс стартовал!
Сегодня в 19:00 по МСК пройдет первое занятие нового потока, на которое может прийти каждый. Оцените пользу нашего подхода на ретрансляции урока в VK!
👨💻 Спикер: Андрей Носов
Тема: Архитектура управления: state machine для AI-агентов
Будем разбираться, как использовать State machine в качестве главного оружия против стохастики (непредсказуемости) LLM.
Что в программе:
● State machine: инварианты и терминальные состояния;
● Паттерны маршрутизации: Supervisor, ReAct, Plan-and-Solve;
● Детекция циклов и настройка аварийных выходов;
● Абстракция от модели: как сделать каркас, который переживет смену LLM/провайдера;
● Адаптация графов под ограничения локальных моделей;
● Версионирование графов и миграции стейта.
Результат занятия: Вы поймете, как спроектировать надежный каркас агента с жестким контролем исполнения и переходов.
👉 Подписывайтесь на нашу группу ВКонтакте, чтобы не пропустить старт трансляции!
Сегодня в 19:00 по МСК пройдет первое занятие нового потока, на которое может прийти каждый. Оцените пользу нашего подхода на ретрансляции урока в VK!
👨💻 Спикер: Андрей Носов
Тема: Архитектура управления: state machine для AI-агентов
Будем разбираться, как использовать State machine в качестве главного оружия против стохастики (непредсказуемости) LLM.
Что в программе:
● State machine: инварианты и терминальные состояния;
● Паттерны маршрутизации: Supervisor, ReAct, Plan-and-Solve;
● Детекция циклов и настройка аварийных выходов;
● Абстракция от модели: как сделать каркас, который переживет смену LLM/провайдера;
● Адаптация графов под ограничения локальных моделей;
● Версионирование графов и миграции стейта.
Результат занятия: Вы поймете, как спроектировать надежный каркас агента с жестким контролем исполнения и переходов.
👉 Подписывайтесь на нашу группу ВКонтакте, чтобы не пропустить старт трансляции!
Распределяет клиентские запросы между серверами, выбирая их по алгоритму, чтобы равномерно распределять нагрузку, избегать перегрузок и обеспечивать стабильную работу системы.
Он получает запрос, перенаправляет его на сервер, принимает ответ и отправляет его обратно клиенту.
Это увеличивает пропускную способность, снижает задержки и оптимизирует использование ресурсов.
Работают как посредники между клиентами и серверами, обрабатывая запросы и передавая данные, скрывая серверы и повышая их безопасность.
Они обеспечивают контроль за сетевым трафиком, снижая риски атак и угроз.
Дополнительно, они могут кэшировать контент для уменьшения нагрузки на сервер, сжимать данные для ускорения передачи и управлять SSL/TLS-шифрованием, разгружая веб-серверы.
Работают как единая точка входа для всех API-запросов, направляя их к нужным микросервисам и собирая результаты.
Они упрощают взаимодействие клиентов с разными сервисами, добавляют защиту, применяют правила, переводят между веб-протоколами и агрегируют данные.
Идеально подходят для работы с микросервисной архитектурой.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥3❤2
Вы годами живёте в Service Container, пишете Form Requests на автомате и знаете, где у Laravel «магия». Вопрос не в том, умеете ли вы, — а в том, как быстро вы смапите привычные концепции на чужой стек, когда прилетит проект на NestJS.
Deva Jayantha сделал именно это: не туториал «с нуля», а таблицу перевода Laravel → NestJS по девяти осям:
— Service Container vs явная регистрация провайдеров в модулях;
— Form Request vs связка DTO + class-validator + Pipe;
— Middleware vs Guards/Pipes/Interceptors (и почему middleware в Nest только про логирование и CORS);
— Eloquent (Active Record) vs TypeORM (Data Mapper);
— Exception handler vs Exception Filters.
Главный сдвиг парадигмы: «convention over configuration» против «explicit over implicit». Всё, что Laravel делает за вас неявно, Nest требует объявить руками и это не хуже, это другая философия с другими trade-offs для больших модульных кодовых баз.
Ничего революционного там не найти, но за 15 минут можно получить готовую ментальную модель, которая сэкономит день онбординга на TypeScript-проекте. Полезно и как аргументация в спорах «а почему у нас Laravel».
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔4❤2👍1🔥1
⌨️ Топ-вакансий по PHP за неделю
Middle Fullstack Developer (PHP/Laravel + React) — от 2000 до 2700 $ — удалёнка
Fullstack-разработчик (PHP, JS) — удалёнка/гибрид (Казань) — Danaflex
Senior Backend разработчик (PHP) — удалёнка — MPSTATS
➡️ Еще больше топовых вакансий — в нашем канале PHP Jobs
Middle Fullstack Developer (PHP/Laravel + React) — от 2000 до 2700 $ — удалёнка
Fullstack-разработчик (PHP, JS) — удалёнка/гибрид (Казань) — Danaflex
Senior Backend разработчик (PHP) — удалёнка — MPSTATS
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🔥1
Forwarded from Библиотека задач по PHP | тесты, код, задания
Почему never называют bottom-типом и где это используется при наследовании?
Anonymous Quiz
34%
Он эквивалентен void
32%
Он подтип любого типа
18%
Он запрещает наследование класса
16%
Работает только в final-классах
🔥2👍1👏1
🏗 Fat controller, fat model, fat service — выбери, где тебе будет больно
Бизнес-логику нужно куда-то положить. Вечный спор не про «как правильно», а про то, какую боль ты выбираешь осознанно.
🔹 В контроллере.
Быстро на старте, через полгода контроллер на 400 строк, логику нельзя переиспользовать из консольной команды, тесты требуют поднимать HTTP-слой. Боль: дублирование и непереиспользуемость.
🔹 В модели (Active Record).
Логика рядом с данными, удобно. Но модель начинает знать про отправку писем, платёжные шлюзы и очереди. God-object, который тащит за собой полприложения в каждый тест. Боль: связность.
🔹 В сервисах / Action-классах.
Логика отделена от транспорта и от хранилища, тестируется на чистых данных. Цена — больше файлов и дисциплина, чтобы сервис не превратился в свалку из 30 методов. Боль: дисциплина.
Практичная середина, которая выживает дольше всего: тонкий контроллер (валидация + вызов), модель хранит данные и простые инварианты, Action/сервис держит сценарий. Один use-case — один класс с одним публичным методом. Растёт линейно, читается за минуту, тестируется без фреймворка.
💬 Какие проекты на каком варианте пишете?
Библиотека пхпшника
Бизнес-логику нужно куда-то положить. Вечный спор не про «как правильно», а про то, какую боль ты выбираешь осознанно.
🔹 В контроллере.
Быстро на старте, через полгода контроллер на 400 строк, логику нельзя переиспользовать из консольной команды, тесты требуют поднимать HTTP-слой. Боль: дублирование и непереиспользуемость.
🔹 В модели (Active Record).
Логика рядом с данными, удобно. Но модель начинает знать про отправку писем, платёжные шлюзы и очереди. God-object, который тащит за собой полприложения в каждый тест. Боль: связность.
🔹 В сервисах / Action-классах.
Логика отделена от транспорта и от хранилища, тестируется на чистых данных. Цена — больше файлов и дисциплина, чтобы сервис не превратился в свалку из 30 методов. Боль: дисциплина.
Практичная середина, которая выживает дольше всего: тонкий контроллер (валидация + вызов), модель хранит данные и простые инварианты, Action/сервис держит сценарий. Один use-case — один класс с одним публичным методом. Растёт линейно, читается за минуту, тестируется без фреймворка.
Библиотека пхпшника
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥2👏1