Кастомный пакет Bagisto: где ломается штатная логика
Штатная сборка Bagisto закрывает базовый сценарий магазина, но как только появляется нестандартная логика — свои правила расчёта скидок, интеграция со складом, обмен с внешней системой заказов — доработка штатной логики через правку ядра превращается в мину замедленного действия. Первое же обновление платформы перезаписывает изменённые файлы, и магазин либо падает, либо тихо теряет часть функционала: заказы проходят, а скидка не применяется.
Второе узкое место — дублирование логики. Когда один и тот же расчёт цены или условие доставки живёт в контроллере, шаблоне и обработчике события, любая правка требует синхронного изменения в трёх местах. Рано или поздно одно из них забывают — и поведение магазина расходится в зависимости от того, через какую страницу пришёл покупатель.
Третья проблема — отсутствие изоляции модулей. Без чётких границ расширение функционала магазина обрастает скрытыми зависимостями: модуль скидок знает о модуле доставки, тот — о логах, и отключить или заменить один блок без правки остальных уже нельзя. Кастомный пакет Bagisto решает это иначе: логика выносится в отдельный пакет, ядро остаётся нетронутым, а обновления платформы проходят без конфликтов при обновлении. Разбираем, как это устроено и где именно штатная сборка начинает мешать.
Что даёт изолированный пакет: эффект в цифрах
Кастомный пакет Bagisto — это отдельный модуль со своим пространством имён, конфигурацией, миграциями и маршрутами, который подключается к платформе как самостоятельная единица. Логика магазина не размазывается по ядру и теме: правки живут в одном репозитории с собственной историей изменений. Именно изоляция кода даёт измеримый эффект, а не «аккуратная архитектура» сама по себе.
Скорость обновления платформы вырастает кратно. Когда кастомизация не трогает ядро, переход на новую ветку Bagisto сводится к обновлению зависимости и прогону тестов пакета — вместо ручного сравнения сотен изменённых файлов. Обновление, которое раньше растягивалось на недели, укладывается в один-два рабочих дня, а окно простоя на проде сокращается до планового релиза.
Снижение регрессий — прямое следствие границ модуля. Изменение в логике скидок или расчёта доставки не задевает оформление заказа, потому что связи между частями описаны контрактами, а не неявными зависимостями. Покрытие пакета тестами показывает, какие сценарии затронуты правкой, и число неожиданных поломок на релиз падает в разы.
Предсказуемость поддержки — это когда новая команда или новый инженер входит в проект без археологии. Структура пакета читается по разделам, точка входа в каждую функцию известна, а откат к предыдущей версии модуля не требует трогать остальную систему. Опишите вашу задачу — вернёмся с оценкой и планом, как это ложится на ваш магазин.
Варианты реализации: пакет, тема или правка ядра
Три подхода различаются не «чистотой кода», а тем, что происходит с вашим магазином при первом же обновлении платформы. Пакет расширения подключается поверх ядра и не трогает его файлы — обновление ставится штатно, а ваша логика остаётся в отдельном слое. Правка ядра решает задачу быстрее всего на старте, но каждое обновление превращается в ручное сравнение изменённых файлов: чем больше правок, тем выше риск, что очередной релиз затрёт доработку или сломает оформление заказа.
Кастомная тема закрывает только представление — вёрстку, шаблоны, оформление витрины — и не подходит, когда нужно менять логику корзины, расчёта доставки или синхронизации с учётной системой.
| Вариант | Когда подходит | Ограничения подхода |
|---|---|---|
| Пакет расширения | Нужна новая логика: правила цен, интеграции, нестандартный расчёт доставки, свои разделы в админке | Требует проектирования точек подключения; часть задач упирается в отсутствие события в ядре |
| Правка ядра | Разовый срочный фикс, который нельзя отложить | Обновления ставятся вручную, конфликты растут с каждой правкой, откат затруднён |
| Кастомная тема | Изменение витрины: вёрстка, шаблоны, оформление карточек и корзины | Не меняет бизнес-логику; при смене шаблонов ядра требует повторной сверки |
Совместимость с обновлениями
Пакет держит совместимость предсказуемо: обновление ядра и обновление пакета — независимые события, и мы фиксируем, какие точки подключения затронуты в новой ветке. Правка ядра такой гарантии не даёт — при каждом релизе нужно проверять, не пересёкся ли ваш код с изменениями разработчиков платформы.
Смешанный сценарий
На практике чаще всего сочетают: логику выносим в пакет, витрину — в тему, а правки ядра сводим к нулю или к минимуму с явной пометкой, чтобы их было видно при обновлении. Такой расклад даёт штатные обновления без простоя и понятный откат на предыдущую версию.
Этапы внедрения пакета: от аудита до передачи
Работа над пакетом идёт итерациями, но внутри каждой итерации порядок этапов фиксирован: сначала разбираемся, как магазин устроен сейчас, потом проектируем изменения, только затем пишем код. Такой порядок снимает главный риск кастомной разработки — пакет, который конфликтует с уже установленными расширениями или ломает оформление заказа.
- Аудит магазина. Смотрим текущую конфигурацию, установленные расширения, кастомизации темы и ядра, точки вмешательства в оформление заказа и каталог. Фиксируем, что можно расширить штатными средствами, а что требует переопределения — это определяет объём работ до начала разработки.
- Схема пакета. Проектируем структуру: какие сущности и таблицы добавляются, какие события и наблюдатели используем, как пакет взаимодействует с существующими модулями. Схему согласуем с вами до написания кода — правки на этом этапе стоят часы, после релиза — дни.
- Настройка интеграций. Подключаем пакет к внешним системам: склад, платежи, доставка, учётные системы. Каждое соединение настраиваем с обработкой ошибок и повторными попытками, чтобы сбой на стороне сервиса не ронял оформление заказа.
- Проверка сценариев. Прогоняем полный путь покупателя — от добавления товара до подтверждения оплаты, включая возвраты, частичные отмены и работу с несколькими складами. Отдельно проверяем поведение при недоступности внешнего сервиса.
- Передача документации. Отдаём описание архитектуры пакета, инструкции по обновлению и откату, схему данных и порядок действий при типовых сбоях. Ваши инженеры могут сопровождать пакет самостоятельно, без зависимости от нас.
Этапы идут с контрольными точками: после аудита вы видите объём и план, после схемы — согласуете архитектуру, после проверки — получаете отчёт по сценариям. Опишите задачу — вернёмся с оценкой сроков и состава работ.
Артефакты на выходе: что получает команда заказчика
Передаём не «папку с кодом», а комплект, по которому ваша команда сможет сопровождать пакет без нас. Ниже — что именно фиксируется в передаче.
- Конфигурации пакета — файлы настроек с описанием каждого параметра: какие значения обязательны, какие зависят от окружения, что меняется при подключении нового канала или языка. Отдельно отмечаем места, где правка ломает совместимость с ядром.
- Схемы интеграций — как пакет стыкуется с каталогом, оформлением заказа, оплатой и складским учётом: какие события он слушает, какие данные отдаёт наружу, где проходит граница ответственности между пакетом и ядром платформы.
- Регламенты обновления — порядок действий при выходе новой ветки ядра: что проверяем до обновления, как откатываемся, какие миграции данных выполняются и в какой последовательности. С правилами, при которых обновление откладывается.
- Инструкции для команды — развёртывание на чистом окружении, локальный запуск, типовые сбои и их признаки. Рассчитаны на разработчика, который видит проект впервые.
- Документация модуля — назначение сущностей, точки расширения, публичные методы с примерами вызова. Плюс журнал решений: почему выбрана такая структура и какие альтернативы отклонены.
- Набор автотестов — покрытие ключевых сценариев: оформление заказа, пересчёт корзины, синхронизация остатков. Тесты запускаются одной командой и служат страховкой при доработках.
- Список зависимостей — внешние библиотеки с указанием, какие можно обновлять свободно, а какие завязаны на логику пакета и требуют проверки.
Комплект передаём на созвоне с разбором: ваши инженеры задают вопросы по коду и схемам, мы показываем развёртывание на тестовом окружении. Опишите задачу — вернёмся с оценкой и планом передачи.
Кейс: как изолированный пакет убрал регрессии
Заказчик — сеть розничных магазинов на Bagisto с несколькими региональными витринами. Логика лояльности, расчёт доставки и правила промо жили прямо в ядре и в теме оформления, поэтому каждое обновление платформы превращалось в ручную правку десятков файлов. Регрессии вылезали то в корзине, то в оформлении заказа, и перед каждым релизом команда неделю прогоняла сценарии вручную.
Что было до
Обновление занимало 3-4 дня: сначала правки в ядре, потом сверка с новой версией, потом откат, если что-то ломалось. За квартал фиксировали 9-12 отказов на проде, из них треть — в оформлении заказа, то есть с потерей выручки. Тесты покрывали меньше половины пользовательских путей, а изменения в теме задевали логику расчётов.
Что изменили
Вынесли всю бизнес-логику в отдельный пакет: свои сервисы, модели, миграции и события, без правок ядра и темы. Пакет подключается как обычная зависимость, конфигурация — через файл настроек, точки расширения — через события и подмену сервисов. Тема осталась только про внешний вид, ядро — только про базовый функционал.
Что стало
Обновление платформы сократилось до нескольких часов: правки в пакете не конфликтуют с ядром, откат — это отключение одной зависимости. Число отказов на проде упало с 9-12 до 1-2 за квартал, покрытие тестами выросло до большей части пользовательских путей, а релизы стали выходить вдвое чаще без ночных правок.
Отдельный эффект — предсказуемость: новая витрина поднимается копированием пакета и сменой настроек, а не форком всего магазина. Логика лояльности и доставки теперь одна на все регионы, расхождения между витринами ушли.
Чем отличается пакет от прямой правки ядра?
Прямая правка ядра — это когда файл платформы меняется на месте: в контроллере, модели или шаблоне правится строка, и всё работает ровно до первого обновления. Формально задача решена, но решение живёт внутри чужого кода и нигде не зафиксировано отдельно. При следующем апдейте платформа перезаписывает изменённые файлы, и правки исчезают — либо, что хуже, конфликтуют с новой версией и ломают уже работающие сценарии.
Пакет — это отдельный модуль, который подключается к платформе и расширяет её через штатные точки расширения: сервис-провайдеры, события, переопределение шаблонов и маршрутов. Ядро остаётся нетронутым, а вся логика лежит в изолированном каталоге со своим пространством имён. Разница проявляется именно на поддержке: обновление платформы не затрагивает код пакета, а если новая версия меняет какой-то интерфейс — правится одно место в модуле, а не разыскиваются десятки правок по всему ядру.
Изоляция даёт ещё два практических следствия. Первое — предсказуемый откат: пакет отключается одной командой, и система возвращается к исходному поведению без восстановления из резервной копии. Второе — переносимость: тот же модуль ставится на другой проект с той же платформой, если логика не завязана на конкретную тему или набор правок.
Риск прямой правки ядра не в том, что она сломается сегодня, а в том, что цена поддержки растёт с каждым обновлением. Через несколько апдейтов никто уже не помнит, какие файлы трогали и зачем, а любое обновление превращается в ручное слияние. Пакет фиксирует изменения в одном месте и делает обновления рутинной операцией, а не проектом с непредсказуемым результатом.
Частые технические сомнения при разработке пакета
Сомнения обычно упираются в четыре вещи: совместимость версий, миграции данных, тестирование и обновления без простоя. Ниже — как мы закрываем каждое из них на уровне архитектуры, а не обещаний.
Пакет будет работать с нашей версией Bagisto и не сломается при обновлении?
Кастомный пакет Bagisto мы собираем как самостоятельный модуль с явно объявленными зависимостями: диапазон поддерживаемых версий ядра фиксируется в манифесте, а не «на словах». Точки расширения — события и сервис-провайдеры — выбираются так, чтобы не переопределять ядро целиком: при апгрейде обновляется платформа, а логика пакета остаётся нетронутой. Перед каждым обновлением прогоняем пакет на целевой ветке в изолированном окружении и фиксируем матрицу совместимости — вы заранее видите, какие версии поддерживаются, а какие требуют доработки.
Как переносятся данные из старой системы без потерь?
Миграции идемпотентны и разбиты на этапы: сначала структура (таблицы, индексы, связи), затем перенос данных пакетами с проверкой контрольных сумм, затем сверка количества и ключевых полей. Тяжёлые операции идём порциями, чтобы не блокировать базу. На каждом этапе есть точка отката: если сверка не сходится, возвращаемся к предыдущему состоянию без ручной правки таблиц.
Как вы тестируете пакет и что с обновлением без простоя?
Покрываем автотестами критичные сценарии — оформление заказа, расчёт, синхронизацию, права доступа — и прогоняем их на каждой сборке. Обновление выкатываем по схеме с переключением трафика: новая версия поднимается рядом, проверяется на боевых данных, и только потом на неё уходит нагрузка. При проблеме трафик возвращается на предыдущую версию за минуты, без остановки магазина.
Если остались сомнения по вашему стеку — опишите задачу, вернёмся с оценкой и планом работ.
Обсудим вашу задачу и вернёмся с планом
Чтобы оценка была предметной, а не «вилкой от потолка», начинаем с разбора задачи, а не с прайса. Нам важно понять, что именно не закрывает штатный функционал: типы товаров, правила цен и скидок, логику склада, интеграции с учётной системой, требования к витрине. Чем точнее описан сценарий, тем меньше допущений в плане работ и тем честнее сроки.
Дальше инженер разбирает, что решается настройкой, а что требует отдельного модуля. Кастомный пакет Bagisto оправдан, когда логика выходит за рамки типовых решений и её нужно изолировать, чтобы обновления платформы не ломали доработки. Мы фиксируем границы пакета, точки расширения и то, как он будет сосуществовать с ядром.
Что происходит после обращения
- Разбор задачи. Созвон с инженером: какие процессы должны работать, кто ими пользуется, что уже есть в системе.
- Аудит текущего решения. Смотрим установленную версию, установленные модули, доработки ядра и риски при обновлении.
- Согласование объёма. Разделяем, что закрывается настройкой, что — пакетом, а что выносим за границы проекта.
- Оценка сроков и этапов. Разбиваем работу на проверяемые шаги с понятным результатом на каждом.
- План работ. Фиксируем последовательность, зависимости, точки приёмки и порядок выката на боевой контур.
- Согласование и старт. После утверждения плана закрепляем ответственного инженера и начинаем с первого этапа.
Если по ходу разбора выясняется, что задача решается без кастомной разработки, мы говорим об этом прямо — это дешевле и быстрее для вас. Опишите задачу в свободной форме: что за магазин, какие процессы не закрываются, что уже пробовали. Вернёмся с оценкой сроков и планом работ, по которому можно принимать решение.
| Подход | Что меняем | Где живёт код | Обновления платформы | Риск регрессий | Срок до первого результата | Кому подходит |
|---|---|---|---|---|---|---|
| Изолированный пакет | Логику, интеграции, оформление заказа, правила расчёта | Отдельный модуль вне ядра | Ставятся без конфликтов | Низкий: ядро не тронуто | Быстрый: базовый контур собирается за один цикл | Магазинам с планами расти и обновляться |
| Своя тема | Внешний вид, шаблоны, частично поведение витрины | Слой оформления поверх платформы | Ставятся с ручной проверкой шаблонов | Средний: правки в разметке задевают вывод | Средний: сначала дизайн, потом логика | Когда задача только в подаче и бренде |
| Правка ядра | Любые файлы платформы напрямую | Внутри исходников платформы | Каждое обновление — ручное слияние | Высокий: любое обновление ломает сборку | Быстрый на старте, дорогой на дистанции | Разовым задачам без планов обновляться |
| Готовое расширение из каталога | Функциональность «как есть» | Сторонний модуль | Зависит от автора расширения | Средний: автор может прекратить поддержку | Быстрый: установка и настройка | Типовым задачам без уникальной логики |
| Параметр | Что фиксируем до старта | Как влияет на срок |
|---|---|---|
| Границы задачи | Какие процессы уходят в пакет, какие остаются штатными | Чем чётче границы, тем короче цикл |
| Точки вмешательства | События и расширения платформы, к которым подключаемся | Меньше пересечений с ядром — меньше проверок |
| Совместимость | Целевая ветка платформы и правила обновления | Проверка совместимости идёт параллельно разработке |
| Данные | Что переносим и как проверяем целостность | Перенос и сверка добавляют отдельный этап |
| Приёмка | Сценарии, по которым заказчик принимает работу | Заранее описанные сценарии убирают возвраты |
| Зона ответственности | Наша сторона | Сторона заказчика |
|---|---|---|
| Проектирование | Границы пакета, схема данных, точки подключения | Согласование правил бизнес-логики |
| Разработка | Код пакета, миграции, автоматические проверки | Доступы к средам и тестовым данным |
| Проверка | Сценарии приёмки, прогон на копии боевых данных | Участие в приёмке, обратная связь по сценариям |
| Передача | Документация, инструкция по обновлению, созвон с командой | Закреплённый специалист на стороне заказчика |
| Поддержка | Исправления и доработки пакета | Своевременное сообщение об изменениях в процессах |
Стек подбираем под задачу, а не наоборот: работаем на профессиональном оборудовании и с проверенными инструментами, поэтому результат воспроизводим на любой среде заказчика. Итог — пакет, который обновляется вместе с платформой и не тянет за собой чужие правки.







