2016-03-25 88 views
4

Paket oluşturuyorum ve kanca işlevini kullanmak istiyorum (bir kullanıcı uygulamasındaki bir alanı güncelleştirdiğinde paket bazı ek doğrulama kuralları eklemelidir).Kancalar?

Olay sistemini kullanarak bunu yapmayı başardım. Yaptığım şey $ kural değişkenini ve $ isteğini dinleyiciye iletmektir, $ rules değişkenini değiştirip iade ediyorum.

Bu kötü bir uygulama mıdır? Bunu yapmanın önerilen yolu ne olurdu?

Yani, işe yarıyor. Sadece bunun için en iyi yol olup olmadığından emin değilim.

aşağıda Kodu:

SettingsController.php (Bu Uygulama altındadır/ve nerede güncelleme üzerinde doğrulama ediyorum) paketim (paketler/değişimi/src/İşleyicilere içinde Sonra

public function update(Setting $setting, Request $request) 
{ 
    $rules = [ 
     'package' => 'required|in:'.implode(config('app.packages'),','), 
     'name' => 'required|max:255|alpha_dash|not_contains:-|unique:auth_setting,name,'.$setting->id.',id,package,'.$setting->package, 
     'description' => '', 
    ]; 

    // Is this bad?? 
    $rules = Event::fire(new SettingsWereSubmitted($request,$rules))[0]; 

    $v = Validator::make($request->all(),$rules); 

) Bu dinleyici (ValidateSettings.php) var: Ben senin bu kod parçasının bakıyorum

public function handle(SettingsWereSubmitted $event) 
{ 
    if($event->request->package == 'exchange') 
    { 
     // Add rules 

     $rules = [ 
      'fee' => 'required|decimal|min_amount:0|max_amount:1|max_decimal:8', 
      'freeze_trade' => 'required|in:1,0', 
     ]; 

     $event->rules['value'] = $rules[$event->request->name]; 

     return $event->rules; 
    } 

} 

cevap

0

if($event->request->package == 'exchange') 

ve required_if doğrulama kuralını kullanarak aynı davranışı daha kolay başarabileceğinizi düşünün.

$rules = [ 
     'package' => 'required|in:'.implode(config('app.packages'),','), 
     'name' => 'required|max:255|alpha_dash|not_contains:-|unique:auth_setting,name,'.$setting->id.',id,package,'.$setting->package, 
     'description' => '', 
     'fee' => 'required_if:package,exchange|decimal|min_amount:0|max_amount:1|max_decimal:8', 
     'freeze_trade' => 'required_if:package,exchange|in:1,0', 
    ]; 

EKLENDİ: Bu arada , ben gelir isteklerini doğrulamak ve isteğin doğrulama Kontrolörü Request sorumluluğundadır değil çünkü denetleyicileri gelen doğrulama kodunu kaldırma isteğinde sınıfları kullanarak öneririm. Laravel'de oldukça kolaydır. Sonra

class UpdateSomethingRequest extends Requst 
{ 

    public function rules() 
    { 
     return [ 
     'package' => 'required|in:'.implode(config('app.packages'),','), 
     'name' => 'required|max:255|alpha_dash|not_contains:-|unique:auth_setting,name,'.$setting->id.',id,package,'.$setting->package, 
     'description' => '', 
     'fee' => 'required_if:package,exchange|decimal|min_amount:0|max_amount:1|max_decimal:8', 
     'freeze_trade' => 'required_if:package,exchange|in:1,0', 
     ]; 
    } 

} 

Ve sadece aşağıdaki gibi yöntemini güncellemek için size Kontrolör ve tip-ipucu yeni istek sınıfından bu kodu kaldırın:: Öncelikle, sizin Http \ daki istek sınıf oluşturmak klasör İstekleri

public function update(Setting $setting, UpdateSomethingRequest $request) 
{ 
// Your request is already validated here so no need to do validation again 
}