2016-12-22 146 views
2

我在控制器Laravel默認驗證規則:如何在控制器Laravel中自定義驗證規則?

$validator = Validator::make($request->all(), [ 
      'email' => 'required|email', 
      'phone' => 'required|numeric', 
      'code' => 'required|string|min:3|max:4', 
      'timezone' => 'required|numeric', 
      'country' => 'required|integer', 
      'agreement' => 'accepted' 
     ]); 

我想這一點,但不知道如何某些參數傳送內部功能:

public function boot() 
    { 
     Validator::extend('phone_unique', function($attribute, $value, $parameters) { 
      return substr($value, 0, 3) == '+44'; 
     }); 
    } 

我怎樣才能程度上驗證通過我自己的規則?例如,我需要驗證的輸入concatination:

$phone = $request->code.' '.$request->phone 

檢查後,如果$phone是存在於數據庫

我想用這個方法:

> $validator->sometimes('phone', 'required|alpha_dash|max:25', function 
> ($input) { 
>    if ((Auth::user()->phone == $input->phone)) { 
>     return false; 
> 
>    } else { 
> 
>     $t = User::where("phone", $input->phone)->get(); 
>     return ($t->count() > 0) ? false : false; 
> 
>    } 
>   }); 

它不會在所有情況下工作裏面有(True, False)

我增加了新的驗證nickname_unique

$validator = Validator::make($request->all(), [ 
      'email' => 'required|email', 
      'code' => 'required|string|min:3|max:4', 
      'phone' => 'required|phone_unique', 
      'timezone' => 'required|numeric', 
      'country' => 'required|integer', 
      'nickname' => 'required|alpha_dash|max:25', 
      'agreement' => 'accepted' 
     ], [ 
      'phone_unique' => 'Phone already exists!', 
      'nickname_unique' => 'Nickname is busy!', 
     ]); 

它不工作,甚至沒有撥打以下previos驗證規則:

Validator::extend('nickname_unique', function ($attribute, $value, $parameters, $validator) { 

      dd("Here"); 

}); 
+0

你能解釋一下,你需要哪種類型的驗證? –

+0

我有兩個傳入參數:'code'和'phone'。我需要驗證兩個驗證功能,並請求數據庫比較代碼,電話與現有的字段在db – dsfsddfsdfsf

+0

我已經發布了答案,請看看! –

回答

1

您可以定義裏面AppServiceProvider這樣您的自定義的驗證:

<?php 

namespace App\Providers; 

use Illuminate\Support\ServiceProvider; 
use Illuminate\Support\Facades\Validator; 

class AppServiceProvider extends ServiceProvider 
{ 
    /** 
    * Bootstrap any application services. 
    * 
    * @return void 
    */ 
    public function boot() 
    { 
     Validator::extend('phone_unique', function ($attribute, $value, $parameters, $validator) { 
      $inputs = $validator->getData(); 
      $code = $inputs['code']; 
      $phone = $inputs['phone']; 
      $concatenated_number = $code . ' ' . $phone; 
      $except_id = (!empty($parameters)) ? head($parameters) : null; 

      $query = User::where('phone', $concatenated_number); 
      if(!empty($except_id)) { 
      $query->where('id', '<>', $except); 
      } 

      return $query->->exists(); 
     }); 

    /** 
    * Register the service provider. 
    * 
    * @return void 
    */ 
    public function register() 
    { 
     // 
    } 
} 

你可以傳遞給校驗時,所有的輸入通過訪問$validator財產 - getData()

您可以自定義的驗證規則後,只需添加一個額外的參數你的規則陣列(在colon剛過)是這樣的:

'phone' => 'required|phone_unique:1', 

傳遞id被忽略,同時檢查條目到數據庫

自定義驗證程序Closure接收四個參數:要驗證的$attribute的名稱,屬性的$value的名稱,傳遞給規則的$parameters的數組以及驗證程序實例。

現在你可以調用驗證這樣的:

$validator = Validator::make($request->all(), [ 
     'email' => 'required|email', 
     'code' => 'required|string|min:3|max:4', 
     'phone' => 'required|phone_unique:1', 
     'timezone' => 'required|numeric', 
     'country' => 'required|integer', 
     'agreement' => 'accepted' 
    ], [ 
    'phone_unique' => 'Phone already exists!', // <---- pass a message for your custom validator 
    ]); 

查看更多有關Custom Validation Rules

+0

Thnaks,但你的答案的最後一部分對我來說不是很清楚 – dsfsddfsdfsf

+0

最後一部分只是解釋瞭如何使用驗證器,讓我再爲你編寫一段代碼! –

+0

我試過驗證:'$ validator->有時候('nickname','required | alpha_dash | max:25',function($ input){}'但是它不穩定 – dsfsddfsdfsf

1
$messsages = array(
     'email.required'=>'Email is Required', 
     'phone.required'=>'Phone number is Required', 

    ); 

    $rules = array(
     'email' => 'required', 
     'phone' => 'required', 

    ); 

    $validator = Validator::make(Input::all(), $rules,$messsages); 



    if ($validator->fails()): 
     $this->throwValidationException($request, $validator); 
    endif; 
+0

在你的情況爲什麼不使用類似: ''departure_date'=>'required | date | after:arrival_date'''? – lmarcelocc

2

,因爲我相信,一堆人正在尋找一些很好的回答這個題目我寫這個答案。因此,我決定分享我用於預訂網站的代碼,在那裏我要檢查是不是arrival_date> departure_date。

我的Laravel版本是5.3。30

public function postSolitudeStepTwo(Request $request) 
{ 
    $rules = [ 
     'arrival_date' => 'required|date', 
     'departure_date' => 'required|departure_date_check', 
     'occasional_accompaniment_requested' => 'required|integer', 
     'accommodation' => 'required|integer', 
     'are_you_visiting_director' => 'required|integer', 
    ]; 

    if ($request->input('are_you_visiting_director') == 1) { 
     $rules['time_in_lieu'] = 'required|integer'; 
    } 

    $messages = [ 
     'departure_date_check' => 'Departure date can\'t be smaller then Arrival date.Please check your dates.' 
    ]; 

    $validation = validator(
     $request->toArray(), 
     $rules, 
     $messages 
    ); 

    //If validation fail send back the Input with errors 
    if($validation->fails()) { 
     //withInput keep the users info 
     return redirect()->back()->withInput()->withErrors($validation->messages()); 
    } else { 
     MySession::setSessionData('arrival_date', $request); 
     MySession::setSessionData('departure_date', $request); 
     MySession::setSessionData('occasional_accompaniment_requested', $request); 
     MySession::setSessionData('accommodation', $request); 
     MySession::setSessionData('are_you_visiting_director', $request); 
     MySession::setSessionData('time_in_lieu', $request); 
     MySession::setSessionData('comment_solitude_step2_1', $request); 

     //return $request->session()->all(); 
     return redirect("/getSolitudeStepThree"); 
    } 
} 

我控制器StepController還有我已經聲明瞭一個,你可以看到一個名爲postSolitudeStepTwo方法。我宣佈規則,並在出發日期注意到,對於規則我們有required|departure_date_check。這將是該法的名稱

app/Providers/AppServiceProvider.php 

的代碼有如下:

public function boot() 
{ 
    Validator::extend('departure_date_check', function ($attribute, $value, $parameters, $validator) { 
     $inputs = $validator->getData(); 
     $arrivalDate = $inputs['arrival_date']; 
     $departureDate = $inputs['departure_date']; 
     $result = true; 
     if ($arrivalDate > $departureDate) { 
      $result = false; 
     } 
     return $result; 
    }); 
} 

當我們需要擴展驗證門面Laravel documentation 5.3 Custom validation rules,該方法的簽名必須是:

Validator::extend(name_of_the_function, function ($attribute, $value, $parameters, $validator) { 

我相信其餘的都很清楚。

希望它能幫助別人。

Cutom Validation error frontend