2015-09-04 22 views
1

我有一個來自我的結帳頁面的AJAX請求,它提供用戶輸入的優惠券代碼。這傳遞到我的控制器像這樣:我應該如何在Laravel 5.1中驗證優惠券?

public function attachCoupon(AttachCouponRequest $request) 
{   
    $response = ShopHelper::checkCoupon($request->coupon); 

    return Response::json($response); 
} 

我「checkCoupon」功能在從輔助類加載的,看起來像這樣:

public static function checkCoupon($code) 
{ 
    $coupon = Coupon::where('code',$code)->get(); 

    if ($coupon->isEmpty()) { 
     $response = ['valid' => false, 'message' => 'Coupon code not recognised']; 
    } elseif (isset($coupon->end_date) && $coupon->end_date < Carbon::now()) { 
     $response = ['valid' => false, 'message' => 'Sorry, that coupon has expired.']; 
    } elseif (isset($coupon->start_date) && $coupon->start_date > Carbon::now()) { 
     $response = ['valid' => false, 'message' => 'Sorry, that coupon is not yet valid.']; 
    } elseif (isset($coupon->status) && $coupon->status === 'inactive') { 
     $response = ['valid' => false, 'message' => 'Sorry, that coupon is inactive.']; 
    } else { 
     $response = ['valid' => true, 'message' => 'Coupon applied successfully!.']; 
    } 

    return($response); 
} 

這似乎非常不laravel樣,是有一個更好的方法來做到這一點?我可以把這個放入我的FormRequest類'AttachCouponRequest'嗎?我應該使用服務提供商嗎?

請幫助我使這更優雅。

謝謝。

回答

1

目前,您使用Eloquent調用get(),但方法名稱表明您只是檢查它是否是有效的優惠券。

那麼,爲什麼不改變查詢,以便您對優惠券本身應用過濾器並返回一個通用的成功/失敗響應?

例如:

$coupon = Coupon::where('code',$code) 
    ->where('end_date', '>=', Carbon::now()) 
    ->where('start_date', '<=', Carbon::now()) 
    ->where('status', '!=', 'inactive') 
    ->count(); 

if (! $count) { 
    return ['valid' => false, 'message' => 'Sorry, that coupon is not valid.']; 
} 

return ['valid' => true, 'message' => 'Coupon applied successfully!']; 

然後,您可以利用查詢範圍,這樣你就可以做這樣的事情,以提高可讀性:

$coupon = Coupon::where('code', $code)->onlyActive()->get(); 
+0

啊是有道理的。完全忘記了查詢範圍。我會將其轉到我的模型中,以便快速輕鬆地參考。 –