Validador personalizado em Laravel 5

Estou atualizando meu aplicativo Laravel de 4 para 5. No entanto, eu tenho um validador personalizado que não consigo trabalhar.

Na L4, criei um arquivo validators.php e incluí-lo no global.php usando require app_path().'/validators.php'; .

Eu tentei fazer um pouco o mesmo na L5. Deixei um validador no app / Validators / Validators.php e atualizei o meu compositor.json .

 "files": [ "app/Validators/Validators.php" ] 

No entanto, agora nada faz em qualquer página. O que eu fiz de errado?

Experimente o seguinte:

  1. Faça uma class de binding onde você pode implementar cada regra que você deseja estender a class Validator .
  2. Crie um provedor de serviços que estenda o ServiceProvider .
  3. Adicione seu provedor de config/app.php personalizado no config/app.php .

Você pode criar a binding na pasta Services como esta:

 namespace MyApp\Services; class Validator extends \Illuminate\Validation\Validator{ public function validateFoo($attribute, $value, $parameters){ return $value == "foo" } } 

Em seguida, use um provedor de serviços para estender o núcleo:

 namespace MyApp\Providers; use MyApp\Services\Validator; use Illuminate\Support\ServiceProvider; class ValidatorServiceProvider extends ServiceProvider{ public function boot() { \Validator::resolver(function($translator, $data, $rules, $messages) { return new Validator($translator, $data, $rules, $messages); }); } public function register() { } } 

Finalmente, importe seu provedor de serviço em config/app.php assim:

 'providers' => [ ... ... 'MyApp\Providers\ValidatorServiceProvider'; ] 

Então, aqui é o que eu fiz ao adicionar uma validação personalizada. isso é para laravel 5.1

  1. Execute PHP Artisan make:request MyFormValidationRequest arquivo PHP Artisan make:request MyFormValidationRequest é criado em app\Requests\MyFormValidationRequest.php

Aqui está o código inicial:

 < ?php namespace App\Http\Requests; use App\Http\Requests\Request; class MyFormValidationRequest extends Request { /** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return true; } /** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ // ]; } } 

IMPORTANTE : altere o valor de retorno do método authorize() para true, se você não estiver fazendo nenhuma autenticação. Seu valor inicial é falso. senão você recebe uma página branca com uma mensagem de erro "Proibida".


  1. Eu adicionei uma regra sob as rules() function rules() , aqui está o que parece

     public function rules() { return [ 'activeuntil' => 'today_onwards' ]; } 

today_onwards é a minha nova validação.

  1. Criei uma pasta chamada 'Serviços' na pasta da Aplicação

  2. Criei um arquivo chamado 'ValidatorExtended.php' na pasta App \ Services, aqui está o código abaixo:

      < ?php namespace App\Services; use Illuminate\Validation\Validator; use Carbon\Carbon; class ValidatorExtended extends Validator { private $_custom_messages = array( "today_onwards" => "The :attribute must be today onwards", ); public function __construct( $translator, $data, $rules, $messages = array(), $customAttributes = array() ) { parent::__construct( $translator, $data, $rules, $messages, $customAttributes ); $this->_set_custom_stuff(); } protected function _set_custom_stuff() { //setup our custom error messages $this->setCustomMessages( $this->_custom_messages ); } protected function validateTodayOnwards( $attribute, $value ) { $now = strtotime('-1 day'); $valueDateFormat = strtotime($value); if($valueDateFormat > $now){ return true; } else { return false; } } } 

Nota: o método validateTodayOnwards é onde você coloca sua lógica. o nome do método deve sempre começar em "validar", em seguida, o nome da sua nova chave de validação que deve ser em caso de título,

Outra nota sua chave de validação deve ser separada por sublinhado e todas as letras pequenas, neste caso, "today_onwards". o sublinhado deve ser colocado antes de todas as primeiras letras maiúsculas no nome do método. Espero ter explicado isso de bom.

O método TodayOnwards é equivalente ao nome de validação de "today_onwards",

Outro exemplo, se eu criasse validateOldPassword, sua chave de validação deveria ser "old_password".

  1. Eu adicionei o código abaixo no app\Providers\AppServiceProvider.php dentro do método boot() .

     Validator::resolver(function($translator, $data, $rules, $messages = array(), $customAttributes = array()) { return new ValidatorExtended($translator, $data, $rules, $messages, $customAttributes); }); 
  2. Não se esqueça de adicionar abaixo da biblioteca, uma é a class Validator e a outra é sua própria class, que é o " ValidatorExtended ".

     use App\Services\ValidatorExtended; use Illuminate\Support\Facades\Validator; 
  3. Veja para o que o arquivo inteiro se parece, [ app\Providers\AppServiceProvider.php ]

     < ?php namespace App\Providers; use Illuminate\Support\ServiceProvider; use App\Services\ValidatorExtended; use Illuminate\Support\Facades\Validator; class AppServiceProvider extends ServiceProvider { /** * Bootstrap any application services. * * @return void */ public function boot() { // Validator::resolver(function($translator, $data, $rules, $messages = array(), $customAttributes = array()) { return new ValidatorExtended($translator, $data, $rules, $messages, $customAttributes); }); } /** * Register any application services. * * @return void */ public function register() { // } } 
  4. É isso aí. feito. você criou sua própria validação personalizada.

  5. Além disso, se você quiser usá-lo em seu controlador, abaixo está o código:

     class testController extends Controller { public function updatePass(MiscValidation $request){ //code here } } 

Em vez de usar a Classe de solicitação, você usa sua própria class, que é uma extensão da class Solicitação.