Kod Yapısı
Bu sayfa dizin düzenini ve günlük çalışırken uyulan konvansiyonları özetler.
Dizin düzeni
app/
Http/Controllers/{Panel,App}/ Requests, Resources aynı ayrımı izler
Http/Middleware/ BindCurrentAccount, EnsureRoutePermission …
Events/ Listeners/ event() → listener yan etkileri (otomatik keşif)
Services/{Panel,App}/ iş kuralları (controller'lar ince kalır)
Models/ Enums/ Concerns/ HasUuids, BelongsToAccount, HasStatus, HasMedia …
Support/ Branding, ActivitySubjectLabels
Support/Hooks/ Registry/ Modules/ modül sistemi (HookManager, Menu/PermissionRegistry, manifest)
Providers/ AppServiceProvider, ModuleServiceProvider …
Console/Commands/ herkobi:install · herkobi:uninstall
routes/
panel.php app.php web.php /panel (yönetim) · /app (üye)
packages/ yerel modül paketleri (path repository, opsiyonel)
resources/
js/pages/{panel,app}/ Inertia sayfaları
js/components/ js/hooks/ paylaşılan UI + hook'lar (ui/* üretilir)
js/layouts/{panel,app,auth}/ yerleşim şablonları
js/types/ merkezî TypeScript tipleri (barrel: @/types)
js/routes/ js/actions/ Wayfinder ile üretilen tipli rotalar
views/ Blade kök + mail şablonları
lang/{tr,en}/ Türkçe birincil, İngilizce paralelBackend konvansiyonları
- Katılık: her dosya
declare(strict_types=1);. ModellerHasUuidsve PHP 8.4 attribute'ları (#[Fillable],#[Hidden],#[Scope]).CarbonImmutable. - İnce controller, kalın servis: iş kuralları
Services/{Panel,App}altında. - Yan etki yalnızca olayla: etkinlik kaydı / bildirim / mail
event() → listenerile; controller/servisten doğrudan tetiklenmez. - Paylaşılan model concern'leri (
app/Concerns/):HasStatus—Active/Passivescope'ları +isActive().HasSortOrder—ordered()scope + otomatiksort_order.BelongsToAccount— Account ilişkisi + koşullu global scope + creating hook.HasMedia— polimorfikmedia()ilişkisi + per-sahip depolama.LogsActivity—Log*/Send*listener'larında etkinlik yazımını DRY tutar.
Frontend konvansiyonları
- TS strict; alias
@/* → ./resources/js/*. React Compiler açık. - shadcn/ui primitifleri
resources/js/components/ui/altında üretilir — elle düzenlenmez (ESLint/Prettier dışı). Tek bilinçli istisna:button.tsxiçindeki globalcursor-pointer. - Endpoint çağrıları: Inertia
useForm+ Wayfinder rota/action fonksiyonları. URL'ler hardcode edilmez. - Tailwind v4 (config dosyası yok); giriş
resources/css/app.css. Koyu temanext-themesile.
TypeScript tipleri
- Paylaşılan / tekrar eden / backend'i yansıtan tipler →
resources/js/types/(barrel:@/types). SayfaProps/PagePropsve tek seferlik küçük görünüm-modelleri sayfanın içinde kalır. { value, label }şekilleri içinOption<TValue>yeniden kullanılır.- Alan tipleri kendi alanında:
definitions.ts,permission.ts,role.ts,session.ts,user-status.ts…
Paylaşılan bileşenler & hook'lar
- DataPagination — herhangi bir Laravel paginator'ını render eder (
PaginatedResource::make(...)ile eşlenir). - ConfirmDelete — AlertDialog tabanlı silme onayı; her yıkıcı işlem önce onaylar.
- Hook'lar:
useAppAuth/usePanelAuth,useBranding,usePermissions,useActiveNavHref,useFlashToast,useCurrentUrl.
Bilinçli "hazır ama bağlanmamış" scaffolding
Herkobi® Panel bir başlangıç kiti olduğundan, tamamlanmış ama henüz hiçbir yerde kullanılmayan parçalar bilerek bulunur — ihtiyaç anında hemen kullanılsınlar diye. Bunlar ölü kod değildir; temizlik sırasında silinmez.
- shadcn/ui setinin tamamı kurulu; bugün yalnızca bir kısmı bağlı.
useCan/useHasRole/useIsSuperAdminizin hook'ları.*_LABEL/*_OPTIONS/*_VALUESenum yardımcıları (status,user-status,user-type).- Alternatif yerleşimler (
auth-card,auth-split,app/panel header layout). media-gallerybileşeni.
Kalite çıtası
bash
composer ci:check # ESLint + Prettier + tsc + Pest — PR öncesi yeşil olmalı- Rota değiştiyse Wayfinder yeniden üretilir;
tr/enmetinleri senkron tutulur. - Davranış değişiklikleri Pest testleriyle kapsanır (feature testleri
RefreshDatabase). components/ui/*elle düzenlenmez; URL/markalama hardcode edilmez.

