Herkobi paneli için generic ürün kataloğu modülü — ürün, sınırsız iç içe kategori ve marka yönetimi. Çekirdeği tek satır düzenlemeden panele menü + rota + yetki + ekran ekler. Tek başına çalışır ve başka hiçbir modüle bağımlı değildir — ihtiyaç duyulan her kurulumda doğrudan kullanılır. Projeye özel uyarlama gerekirse sonradan yapılır.
Modül tam bir Laravel kurulumu değildir — küçük bir composer paketidir ve bir host (Herkobi panel) içine takılır. React/shadcn/Tailwind paketin içinde yoktur; ekran
.tsx'leri host'un bileşenlerini@alias ile import eder ve host'un Vite'ı derler.
- Ürün yönetimi — liste, arama, oluştur, görüntüle, güncelle, sil. Alanlar: ad, slug (addan otomatik), SKU, seri no, açıklama, görsel, fiyat, indirimli fiyat, kategori, marka, aktif/pasif durumu. Varyasyon yoktur.
- Kategoriler —
parent_idile sınırsız iç içe ağaç. Döngü koruması serviste (bir kategori kendisinin/torununun altına taşınamaz). - Markalar — sade marka kayıtları.
- Tek görsel — ürün, kategori ve markanın her biri için tek görsel. Public disk'e yüklenir; 1 MB (1024 KB) ile sınırlı (JPG/PNG/WEBP).
- Hafif arama ucu — başka ekranlardan ürün aramak için JSON uç noktası.
- Modeller:
HasUuids,SoftDeletes,BelongsToAccount,HasStatus.
.
├─ composer.json # auto-discovery (extra.laravel.providers)
├─ module.json # install/uninstall manifesti
├─ src/
│ ├─ ProductServiceProvider.php # hook bağlamaları (rota/menü/yetki)
│ ├─ Models/{Product,Category,Brand}.php # HasUuids, SoftDeletes, BelongsToAccount, HasStatus
│ ├─ Services/{Product,Category,Brand}Service.php # iş mantığı + görsel yükleme (FileService)
│ ├─ Http/
│ │ ├─ Controllers/Panel/{Products,Categories,Brands}Controller.php
│ │ ├─ Requests/Panel/Save{Product,Category,Brand}Request.php # 1MB görsel doğrulaması
│ │ └─ Resources/Panel/{Product,Category,Brand}Resource.php
│ ├─ Events/Product/ # Created / Updated / Deleted
│ └─ Listeners/Product/ # activity-log kayıtları
├─ database/
│ ├─ migrations/..._create_{brands,categories,products}_table.php
│ └─ factories/{Brand,Category,Product}Factory.php
└─ resources/js/
├─ pages/panel/{products,categories,brands}/ # index / create / show (host Vite derler)
├─ components/
│ ├─ {product,category,brand}-form-fields.tsx
│ └─ image-field.tsx # ortak tek-görsel yükleme alanı
└─ types/product.ts
Görseller public disk altında products/, categories/, brands/
klasörlerinde tutulur (FileService::storePublicImage). Modelde yalnızca
image_path (string) kolonu vardır; kalıcı public URL Resource'ta üretilir.
Tek görsel mantığı: yeni görsel yüklenince eski dosya silinir; formdaki
"Görseli kaldır" seçeneği mevcut görseli temizler. 1 MB sınırı Save*Request
içinde (image ... max:1024) uygulanır.
ProductServiceProvider::register() içinde, çekirdek hiç düzenlenmeden:
| Hook | Katkı |
|---|---|
panel.routes.register |
panel.products.*, panel.categories.*, panel.brands.* rotaları |
panel.menu.register |
Kendi menü grubu: Ürünler (Ürünler / Kategoriler / Markalar) |
panel.permissions.register |
İlgili yetkiler (source: 'product') |
Not: Görsel yüklemesi için
products/categories/brandsupdate rotalarıPOST'tur (multipart yükleme).boot()yalnızca migration yükler.
Modül ürün işlemlerinde şu olayları yayınlar. Başka modüller (ör. stok, sipariş) bunları dinleyerek product'a bağlanabilir; product onlara bağımlı değildir:
ProductCreatedEventProductUpdatedEventProductDeletedEvent
Host = çalışan bir Herkobi panel checkout'u. Panel modülleri
packages/*/module.json ve vendor/herkobi/*/module.json yollarından keşfeder.
- Bu repo'yu panelin yanına klonla (ör.
../herkobi-product-module). - Panelin
composer.json'una path repository ekle: - Panelde:
composer require herkobi/product:@dev php artisan herkobi:install product # migrate + yetki seed php artisan storage:link # public görseller için (bir kez) npm run build # products/categories/brands ekranlarını derle
- Sidebar'da Ürünler görünür (Super Admin'de hemen; diğerlerinde
Yetkiler/Roller'den
panel.products.*vb. atanınca).
Windows: symlink için Geliştirici Modu açık olmalı; değilse composer kopyalar (çalışır ama her değişiklikte
composer update herkobi/product).
php artisan herkobi:uninstall product # composer remove'dan ÖNCE
composer remove herkobi/productmodule.json: permissions: "remove" (kaldırınca yetkiler silinir),
purge_data: false (ürün/kategori/marka verisi korunur).