05 Ayar, yetki, uç
Ayar
Modülün settings()'i App\Core\Settings\SettingDefinition listesi döner; panel formu, doğrulama, arama ve işlem geçmişi kendiliğinden gelir:
new SettingDefinition(
key: 'reports.weekly_day', type: 'int', default: 1, label: 'Rapor günü', group: 'Raporlar',
help: '1 = pazartesi', min: 1, max: 7, scope: 'project',
);key:grup.ad(küçük harf, rakam,_,.) ·type:int,float,bool,stringoptions(seçim listesi),format: 'color' | 'image'(renk / görsel seçici),unitscope:project(Proje Ayarları) ya dasystem(Sistem Ayarları); verilmezseGüvenlikveSistem sağlığıgrupları sistem, gerisi proje.- Okumak:
SettingsService::instance()->get('reports.weekly_day').
Yapılandırılmış değer (liste, nesne) için anahtar-değer deposu App\Core\Support\Options (get, set). Gizli değer Secret::seal() ile saklanır ve panele geri gönderilmez (password_set: true gibi bir bayrak döner).
Yetki ve roller
- Modülün yetkisi
capabilities()'de: anahtarkm_ile başlar (km_view_reports), etiket ve grup Türkçe. - Yönetici bütün yetkilere sahiptir; diğer roller panelde Kullanıcılar ve Roller'den düzenlenir. Hazır rollerdeki yeri çatının yetkileri için
Roles::DEFAULTS. - Kapalı modülün yetkisi yoktur: yönetici dahil kimse göremez, menü ve sayfalar kendiliğinden gizlenir.
- Yalnızca ana projede olan özellik: yetkisini
Sites::isMain()ile süzün.
Uç (API adresi)
// routes/project.php (/api/v1 altında)
Route::middleware(['auth.jwt', 'activity', 'cap:km_access_panel'])->group(function () {
Route::get('raporlar', [ReportsController::class, 'index'])->middleware('cap:km_view_reports');
Route::post('raporlar/gonder', [ReportsController::class, 'send'])->middleware('cap:km_view_reports')->name('reports.sent');
});Kurallar (ArchitectureTest denetler):
- Her panel ucu
cap:ister. Herkese açık uç (form gönderimi gibi) testteki izin listesine gerekçeyle eklenir ve istek sınırı (throttle:) alır. - Yazma rotasının adı İşlem Geçmişi'nde başlığı olan bir olay olmalı: çatı için
Core\Activity\ActivityCatalog, modül içinevents(). - İsteğe bağlı modülün rotası
module:<ad>ile (kapalıyken 404). - Hata:
throw ValidationException::fields(['alan' => 'Türkçe ileti'])(422) ya dathrow new DomainException('km_kod', 'Türkçe ileti', 409); ön yüz kodlarıkodmob-frontend/src/domain/errors.js'te okur. - Controller dizi döner (JSON); girdi
$this->input($request).
İşlem geçmişi ve olaylar
Adı olan yazma rotası kendiliğinden İşlem Geçmişi'ne düşer (kim, ne zaman, hangi kayıt). Ayrıntı eklemek: Activity::subject('tur', $id, 'Başlık'), Activity::with([...]). Bildirim ve canlı şerit olayları modülün events()'inde başlık ve tonla tanımlanır.
Mesajlar ve çok dilli panel
Kullanıcıya giden her sunucu mesajının sabit bir kodu vardır (message_code, metinden türer: km_m_…; alan hataları details.codes). İş mantığının kodu (code, ör. km_brief_not_found) ayrıdır. Yeni sabit mesaj eklenince katalog yeniden üretilir (test kilitli):
php artisan kodmob:messages # resources/messages.jsonPanelin metinleri Türkçe yazılır, anahtar metnin kendisidir: şablona anahtar yazılmaz. Derleme panelin metinlerini toplar (km-panel-strings.json); Sistem Ayarları › Panel dili bütün metinleri ve kodlu mesajları tek dosyada (frontend-lang.json) verir, doldurulan dosya içe aktarılınca dil kurulur; kişi dilini Profilim'den seçer. İçinde değişken olan metin (${n} kayıt silindi) katalogda yoktur ve Türkçe kalır; betikte sabit metin çeviri için pt('…') (panel/i18n.js).
Bildirim ve anlık bildirim
Panel bildirimi (zil, Bildirimler sayfası) yetkisi olanlara: NotificationService::notifyCapable(Capability::…, 'tur.olay', 'Başlık', 'metin', PanelUrl::to(...), 'success'). Bildirim oluşunca kişinin anlık bildirimi açık cihazlarına da gider (Web Push; Core\Push): ek kod gerekmez. Panel dışında doğrudan göndermek (ör. site üyesine sipariş durumu):
SendPush::to('member', $memberId, ['title' => 'Siparişiniz kargoda', 'body' => 'KM-1042', 'url' => '/hesabim/siparisler/1042']);Gönderim arka planda (Background), tek deneme; biten abonelik (404 / 410) kendiliğinden silinir. Şifre RFC 8291, gönderen kimliği RFC 8292 (VAPID; anahtar çifti proje başına, ilk istekte üretilir). Abonelik adresi yalnızca bilinen itme servislerinden olabilir (Google, Mozilla, Apple, Microsoft): sunucu başka adrese istek atmaz.