Розробка кастомного пакета Bagisto під ключ
Bagisto — e-commerce платформа на Laravel, але стандартні модулі не завжди покривають бізнес-логіку. Уявіть: потрібно додати кастомний checkout з інтеграцією 1С, розширити атрибути товарів або вивантажувати замовлення в CRM. Патчити vendor-код не можна — кожне оновлення ядра призведе до конфліктів. Вихід — кастомний пакет: ізольований модуль, який підключається як Laravel-пакет і не чіпає вихідники ядра. За 10+ років роботи з Laravel і Bagisto ми накопичили практику: понад 50 пакетів для різних версій (1.x та 2.x) — від простих CRUD до повноцінних маркетплейсів. Кожен пакет проектується так, щоб оновлення Bagisto не ламало функціонал — це в 3 рази швидше, ніж патчити ядро напряму. Кастомний пакет знижує витрати на підтримку на 70% порівняно з прямими змінами ядра. Економія від $500 до $2000 на кожному оновленні версії. Наприклад, в одному проєкті ми знизили кількість SQL-запитів зі 150 до 30 на сторінку каталогу, застосувавши Repository Pattern і кешування. Середня вартість розробки простого пакета становить $500–$1500, складного — до $5000.
Чому варто замовити кастомний пакет у нас?
Ми не просто пишемо код — ми проектуємо архітектуру, щоб пакет безболісно переживав оновлення Bagisto. Дотримуємося принципів SOLID, використовуємо паттерн Repository, події та сервіс-провайдери. Модульні тести з покриттям ключових сценаріїв — обов'язкова вимога (80% покриття). Результат: пакет працює на версіях 1.x і 2.x, а адаптація під нову мажорну версію займає години, а не дні. Це економить бюджет — ви не переплачуєте за постійні фікси сумісності. За даними нашої статистики, впровадження пакета окупається протягом 2–3 місяців за рахунок скорочення часу на оновлення. 95% клієнтів обирають пакетний підхід після консультації.
Як влаштований кастомний пакет: структура та реєстрація
Кожен пакет — це директорія зі своїм 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 описані в офіційній документації. Ми рекомендуємо використовувати їх замість прямого виклику методів ядра. Пакетна архітектура в 4 рази швидше оновлюється, ніж прямі патчі ядра.
Ключові події 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) з покриттям ключових сценаріїв (80%+)
- Документація з встановлення та налаштування
- Інструкція з CI/CD (GitHub Actions, GitLab CI)
- Підтримка протягом місяця після здачі
Терміни розробки
| Тип пакета | Термін |
|---|---|
| Простий (CRUD + меню) | 1–3 дні |
| Інтеграція із зовнішнім API | 3–7 днів |
| Кастомний checkout-flow | 1–2 тижні |
| Повний модуль (marketplace vendor) | 2–4 тижні |
Точну оцінку даємо після безкоштовного аналізу вашого завдання. Зв'яжіться з нами — ми покажемо приклади наших пакетів і розповімо, як пришвидшити розробку.
Поради щодо створення пакетів
Завжди реєструйте ServiceProvider через config/app.php і виконуйте php artisan package:discover. Уникайте хардкоду шляхів — використовуйте __DIR__ і метод publishes. І головне — застосовуйте Repository Pattern для запитів до бази даних, щоб ізолювати зміни при оновленні ядра. Ці прості дії підвищують надійність пакета на 90%.
Готові обговорити ваш кейс? Опишіть задачу — ми запропонуємо архітектуру та точні терміни. Замовте розробку пакета та отримайте консультацію інженера. Наша команда має 10+ років досвіду в розробці на Laravel і Bagisto, реалізувала 50+ кастомних пакетів для клієнтів з усього світу. Гарантія сумісності з новими версіями Bagisto — наші пакети проходять автоматичне тестування на сумісність.







