Разработка кастомного пакета Bagisto под ключ
Bagisto — e-commerce платформа на Laravel, но стандартные модули не всегда покрывают бизнес-логику. Представьте: нужно добавить кастомный checkout с интеграцией 1С, расширить атрибуты товаров или выгружать заказы в CRM. Патчить vendor-код нельзя — каждое обновление ядра приведёт к конфликтам. Выход — кастомный пакет: изолированный модуль, который подключается как Laravel-пакет и не трогает исходники ядра. За 10+ лет работы с Laravel и Bagisto мы накопили практику: более 50 пакетов для разных версий (1.x и 2.x) — от простых CRUD до полноценных маркетплейсов. Каждый пакет проектируется так, чтобы обновление Bagisto не ломало функционал — это в 3 раза быстрее, чем патчить ядро напрямую. Например, в одном проекте мы снизили количество SQL-запросов со 150 до 30 на страницу каталога, применив Repository Pattern и кэширование.
Почему стоит заказать кастомный пакет у нас?
Мы не просто пишем код — мы проектируем архитектуру, чтобы пакет безболезненно переживал обновления Bagisto. Соблюдаем принципы SOLID, используем паттерн Repository, события и сервис-провайдеры. Модульные тесты с покрытием ключевых сценариев — обязательное требование. Результат: пакет работает на версиях 1.x и 2.x, а адаптация под новую мажорную версию занимает часы, а не дни. Это экономит бюджет — вы не переплачиваете за постоянные фиксы совместимости. По данным нашей статистики, внедрение пакета окупается в течение 2–3 месяцев за счёт сокращения времени на обновления.
Как устроен кастомный пакет: структура и регистрация
Каждый пакет — это директория со своим composer.json, поставщиком услуг (ServiceProvider) и автозагрузкой PSR-4. Типовая структура:
packages/MyCompany/Catalog/ ├── src/ │ ├── Http/Controllers/Admin/ │ ├── Models/ │ ├── Repositories/ │ ├── Database/Migrations/ │ ├── Resources/views/admin/ │ ├── Config/menu.php │ ├── Routes/ │ └── Providers/CatalogServiceProvider.php └── composer.json Регистрация начинается с добавления autoload в корневой composer.json и выполнения composer dump-autoload. ServiceProvider — точка входа: он загружает маршруты, миграции, представления и подписывается на события ядра.
Пример ServiceProvider:
use Illuminate\Support\ServiceProvider; use Illuminate\Support\Facades\Event; class CatalogServiceProvider extends ServiceProvider { public function register(): void { $this->mergeConfigFrom(__DIR__.'/../Config/menu.php', 'menu'); } public function boot(): void { $this->loadRoutesFrom(__DIR__.'/../Routes/admin.php'); $this->loadRoutesFrom(__DIR__.'/../Routes/shop.php'); $this->loadMigrationsFrom(__DIR__.'/../Database/Migrations'); $this->loadViewsFrom(__DIR__.'/../Resources/views', 'mycompany-catalog'); $this->loadTranslationsFrom(__DIR__.'/../Resources/lang', 'mycompany-catalog'); $this->publishes([ __DIR__.'/../Resources/assets' => public_path('vendor/mycompany/catalog'), ], 'mycompany-catalog-assets'); Event::listen( 'catalog.product.create.after', 'MyCompany\Catalog\Listeners\ProductCreatedListener' ); } } Затем регистрируем провайдер в config/app.php. Совет: не забудьте выполнить
Команда php artisan package:discover после установки.package:discover перегенерирует кеш пакетов, чтобы Laravel автоматически зарегистрировал новый провайдер. Без этого пакет может не загрузиться.
Почему Repository Pattern — основа стабильного пакета?
Bagisto использует Repository поверх Eloquent, и кастомным пакетам стоит следовать тому же пути. Прямые запросы к модели приводят к N+1 проблемам и жёсткой связности. Repository абстрагирует логику выборки и упрощает тестирование — в нашей практике переход на репозитории снижал количество запросов в 5 раз. Пример репозитория для кастомного атрибута:
use Webkul\Core\Eloquent\Repository; class CustomAttributeRepository extends Repository { public function model(): string { return CustomAttribute::class; } public function getByProduct(int $productId): \Illuminate\Support\Collection { return $this->where('product_id', $productId) ->where('is_active', true) ->orderBy('sort_order') ->get(); } } Репозиторий регистрируется в ServiceProvider через контейнер Laravel.
Vue-компоненты и админ-меню
Bagisto 2.x построен на Vue 3 + Vite. Компоненты пакета регистрируются глобально через плагин:
import CustomAttributeForm from './components/CustomAttributeForm.vue'; export default { install(app) { app.component('custom-attribute-form', CustomAttributeForm); } }; Подключается в Vite через alias или публикацию ассетов. Пункты меню администратора описываются в Config/menu.php с ключами, сортировкой и иконками.
Как перехватывать события ядра и что это даёт?
События — основной механизм расширения без патчинга. Bagisto генерирует события после создания заказа, товара, регистрации пользователя. Мы используем их для запуска слушателей: отправка email, индексация в Elasticsearch, синхронизация с ERP. Слушатель ставит задачу в очередь и не замедляет основной запрос.
use MyCompany\Catalog\Jobs\IndexProduct; class ProductCreatedListener { public function handle($product): void { dispatch(new IndexProduct($product->id)); } } События Bagisto описаны в официальной документации. Мы рекомендуем использовать их вместо прямого вызова методов ядра.
Ключевые события Bagisto:
| Событие | Когда срабатывает |
|---|---|
checkout.order.save.after |
После создания заказа |
catalog.product.create.after |
После создания товара |
customer.registration.after |
После регистрации покупателя |
sales.invoice.save.after |
После создания инвойса |
catalog.product.update.after |
После обновления товара |
Как установить кастомный пакет за 5 шагов
- Разместите код пакета в
packages/CompanyName/ModuleName. - Добавьте
autoloadв корневойcomposer.json. - Зарегистрируйте ServiceProvider в
config/app.php. - Опубликуйте ассеты:
php artisan vendor:publish --tag=mycompany-catalog-assets. - Запустите миграции:
php artisan migrate.
Подробнее о структуре пакетов читайте в официальной документации Laravel.
Что входит в результат?
- Исходный код пакета с
composer.jsonи автозагрузкой PSR-4 - Модульные тесты (PHPUnit) с покрытием ключевых сценариев
- Документация по установке и настройке
- Инструкция по CI/CD (GitHub Actions, GitLab CI)
- Поддержка в течение месяца после сдачи
Сроки разработки
| Тип пакета | Срок |
|---|---|
| Простой (CRUD + меню) | 1–3 дня |
| Интеграция с внешним API | 3–7 дней |
| Кастомный checkout-flow | 1–2 недели |
| Полный модуль (marketplace vendor) | 2–4 недели |
Точную оценку даём после бесплатного анализа вашей задачи. Свяжитесь с нами — мы покажем примеры наших пакетов и расскажем, как ускорить разработку.
Распространённые ошибки при создании пакета
Разработчики часто забывают зарегистрировать ServiceProvider — пакет не работает, но ошибки нет. Всегда проверяйте php artisan package:discover. Другая ошибка — хардкод путей вместо использования __DIR__ и метода publishes, что делает пакет немобильным. И третий частый промах — прямые запросы к моделям вместо Repository, ведь при обновлении ядра меняется схема БД, а репозиторий изолирует изменения.
Готовы обсудить ваш кейс? Опишите задачу — мы предложим архитектуру и точные сроки. Закажите разработку пакета и получите консультацию инженера.







