Kullanıcılar subscription planlarını görebilmeli ve seçebilmeli.
/subscriptions veya /plansKullanıcı fiyatlandırma döngüsünü seçebilmeli.
Subscription satın alımı sepete eklenmeden direkt checkout'a gitmeli.
// routes/web.php
Route::get('/subscriptions', [SubscriptionController::class, 'index'])
->name('subscriptions.index');
Route::get('/subscriptions/checkout/{plan}/{cycle}', [SubscriptionController::class, 'checkout'])
->name('subscriptions.checkout');
Seçenek A: Livewire Component (Önerilen)
// Modules/Subscription/app/Http/Livewire/Front/SubscriptionPlansComponent.php
class SubscriptionPlansComponent extends Component
{
public $billingCycle = 'monthly'; // monthly | yearly
public $plans;
public function mount() {
$this->plans = SubscriptionPlan::where('is_active', true)
->where('is_public', true)
->orderBy('sort_order')
->get();
}
public function buyNow($planId) {
return redirect()->route('subscriptions.checkout', [
'plan' => $planId,
'cycle' => $this->billingCycle
]);
}
}
Subscription checkout'u için özel bir route ve controller metodu:
// SubscriptionController::checkout()
public function checkout($planId, $cycle)
{
$plan = SubscriptionPlan::findOrFail($planId);
// Fiyat hesapla
$price = $cycle === 'yearly' ? $plan->price_yearly : $plan->price_monthly;
// Session'a kaydet (Cart yerine)
session()->put('subscription_checkout', [
'plan_id' => $plan->subscription_plan_id,
'billing_cycle' => $cycle,
'price' => $price
]);
return redirect()->route('checkout.subscription');
}
Ana Sayfa: resources/views/subscriptions/index.blade.php
Shop Products: Cart → Checkout
Subscription: Session → Checkout (Cart bypass)
İki farklı flow olacak. CheckoutPage her ikisini de desteklemeli.
Aylık ve yıllık fiyatlar price_monthly ve price_yearly fieldlarından gelir.
Yıllık seçildiğinde indirim vurgusu göster (örn: "2 Ay Bedava!").
Subscription her zaman dijital → requiresShipping = false
Checkout'ta teslimat adresi gizli, sadece fatura görünür.