💻 Kod Örnekleri - Ortak Sistem
1️⃣ isPremium() - Trial & Premium Lazy Check
// app/Models/User.php
public function isPremium(): bool
{
if (!$this->isMuzibuTenant()) {
return false;
}
$subscription = $this->subscriptions()
->where('status', 'active')
->where('ends_at', '>', now())
->first();
// 🔥 LAZY CHECK: Bitmiş subscription var mı?
$expiredSubscription = $this->subscriptions()
->where('status', 'active')
->where('ends_at', '<=', now())
->first();
if ($expiredSubscription) {
// Status güncelle
$expiredSubscription->update(['status' => 'expired']);
// 🎉 EVENT DISPATCH!
if ($expiredSubscription->plan->is_trial) {
event(new \\App\\Events\\TrialExpired($this, $expiredSubscription));
} else {
event(new \\App\\Events\\SubscriptionExpired($this, $expiredSubscription));
}
}
return $subscription ? true : false;
}
2️⃣ Device Limit Check - Giriş Sırasında
// Modules/Muzibu/app/Services/DeviceService.php
public function checkDeviceLimit(User $user): bool
{
$limit = $this->getDeviceLimit($user);
$activeCount = $this->getActiveDeviceCount($user);
// Limit aşıldı mı?
if ($activeCount >= $limit) {
// 🎉 EVENT DISPATCH!
event(new \\App\\Events\\DeviceLimitExceeded($user, $activeCount, $limit));
// En eski cihazı çıkar (opsiyonel - listener'da da yapılabilir)
$this->logoutOldestDevice($user);
return false;
}
return true;
}
3️⃣ Event Listener - Email & Bildirim
// app/Listeners/SendTrialExpiredNotification.php
class SendTrialExpiredNotification
{
public function handle(TrialExpired $event)
{
$user = $event->user;
$subscription = $event->subscription;
// 1. Email gönder
Mail::to($user->email)
->send(new TrialExpiredMail($user));
// 2. Push bildirim
$user->notify(new TrialExpiredNotification());
// 3. Log
Log::info("Trial expired", [
'user_id' => $user->id,
'subscription_id' => $subscription->id,
]);
// 4. Analytics
Analytics::track('trial_expired', [
'user_id' => $user->id,
]);
}
}
4️⃣ Cron Job - Yedek Temizlik (Hala Gerekli!)
// app/Console/Kernel.php
protected function schedule(Schedule $schedule)
{
// YEDEK: Siteye hiç girmeyen kullanıcılar için toplu temizlik
$schedule->call(function () {
$expired = Subscription::where('status', 'active')
->where('ends_at', '<=', now())
->get();
foreach ($expired as $subscription) {
$subscription->update(['status' => 'expired']);
// 🎉 EVENT DISPATCH!
if ($subscription->plan->is_trial) {
event(new TrialExpired($subscription->user, $subscription));
} else {
event(new SubscriptionExpired($subscription->user, $subscription));
}
}
Log::info("Cron expired {$expired->count()} subscriptions");
})->daily();
}
📋 Tüm Event'lar
// app/Events/TrialExpired.php
class TrialExpired
{
public $user;
public $subscription;
public function __construct(User $user, Subscription $subscription)
{
$this->user = $user;
$this->subscription = $subscription;
}
}
// app/Events/SubscriptionExpired.php
class SubscriptionExpired { ... }
// app/Events/DeviceLimitExceeded.php
class DeviceLimitExceeded
{
public $user;
public $currentCount;
public $limit;
}
// app/Events/PaymentFailed.php
class PaymentFailed { ... }
// app/Events/SubscriptionRenewed.php
class SubscriptionRenewed { ... }
// app/Events/SubscriptionCancelled.php
class SubscriptionCancelled { ... }
// app/Events/GracePeriodStarted.php
class GracePeriodStarted { ... }
🎧 Listener Örnekleri
Tek Event → Çoklu Listener
// app/Providers/EventServiceProvider.php
protected $listen = [
TrialExpired::class => [
SendTrialExpiredEmail::class, // Email gönder
SendTrialExpiredNotification::class, // Push bildirim
LogTrialExpired::class, // Log tut
TrackTrialExpiredAnalytics::class, // Analytics
SendTrialExpiredWebhook::class, // Webhook (opsiyonel)
],
DeviceLimitExceeded::class => [
LogoutOldestDevice::class, // En eski cihazı çıkar
SendDeviceLimitNotification::class, // Bildirim gönder
LogDeviceLimit::class, // Log
],
SubscriptionExpired::class => [
SendSubscriptionExpiredEmail::class,
UpdateUserPremiumStatus::class, // Cache temizle
LogSubscriptionExpired::class,
],
];
💡 Avantaj:
Yeni bir listener eklemek istersen? Sadece array'e ekle! Kod değiştirmeden.
// Yeni listener ekle
TrialExpired::class => [
SendTrialExpiredEmail::class,
SendTrialExpiredNotification::class,
SendTrialExpiredSMS::class, // 🆕 Yeni! SMS gönder
];