2016-12-22 2 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 игнорироваться при проверке записей в БД

Пользовательский валидатор Закрытие получает четыре аргумента: имя проверяемого $attribute, атрибут $value, массив $parameters, переданный правилу, и экземпляр Validator.

Теперь вы можете вызвать валидатор как это:

$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

Я пишу этот ответ, потому что я считаю, что группа людей ищет хороший ответ для этой темы. Поэтому я решил поделиться своим кодом, который я использую для бронирования сайта, где я хочу проверить, что IS NOT 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 фасад, подпись этого метода должен быть:

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

И я считаю, что остальное ясно.

Надеюсь, это поможет кому-то.

Cutom Validation error frontend

Смежные вопросы