Tüm SaaS projeleri sonuçta benzer bir şeye dönüşür: Kullanıcıların e-posta, push bildirimleri, Slack gibi bildirim ayarlarını kategori bazında seçebildiği bir ekran. Bu mantık daima uygulama genelinde via() dizileri ve politika sınıfları içerisinde dağılır.
Bu durumu ayrı bir pakete aktardım: Laravel Notify Matrix.
Sorun
Sorun
// Öncesi — her Laravel uygulamasının sonunda yaptığı şey:
public function via($notifiable): array
{
$channels = ['database'];
if ($notifiable->wantsMail('orders')) {
$channels[] = 'mail';
}
if ($notifiable->wantsSlack('orders') && config('app.slack_enabled')) {
$channels[] = 'slack';
}
return $channels;
}
Paket
Paket
// Kullanıcı modeli
use Scabarcas\LaravelNotifyMatrix\Concerns\HasNotificationPreferences;
class User extends Authenticatable
{
use HasNotificationPreferences;
}
// Bildirim sınıfı
use Scabarcas\LaravelNotifyMatrix\Attributes\NotificationGroup;
#[NotificationGroup('orders')]
class OrderShipped extends Notification
{
public function via($notifiable): array
{
return ['mail', 'database'];
}
}
// Herhangi bir yerden
$user->wants('orders', 'mail');
$user->disable('orders', 'mail');
$user->enable('orders', 'database');
$user->getPreferencesForGroup('orders');
$user->clearPreferences('orders');
via() metodu aynı kalır — deklaratif, sade, koşulsuz.
Altta Nasıl Çalışır
Altta Nasıl Çalışır
Illuminate\Notifications\Events\NotificationSending üzerine bir dinleyici, kullanıcının opt-out (katılmama) ettiği kanallar için false döner. Zorunlu kanallar ise kullanıcı tercihlerini bypass eder. #[NotificationGroup] niteliği veya class_map girdisi olmayan bildirimler tamamen göz ardı edilir.
Çözümleme sırası:
- Kanala
groups.bağlıysa → iletilir..forced - Kullanıcıda saklı bir tercih hali varsa → onu kullan.
- Aksi takdirde, grup
default_policykarar verir (global varsayılan ile geri dönüş sağlar).
Mimari Notlar
Mimari Notlar
PreferenceManagerçözümlemenin yönetimini üstlenir.PreferenceRepositoryveGroupResolverarayüzlerdir — Redis, olay tabanlı çözümleyiciler veya başka bir şeyle değiştirebilirsiniz.- Trait, yöneticinin ince bir yüzüdür.
- Testler, SQLite bellek içi üzerinde Pest + Orchestra Testbench ile çalıştırılır.
Bağlantılar
Bağlantılar
Geri bildirimlerinizi bekliyorum.
Kaynak: Orijinal Makale


