Existe algumas formas de fazer isso, eu particularmente prefiro construir uma classe e usar o método dela da seguinte forma:
Crie uma pasta em app
com o nome de Validators
, sendo que o seu namespace
será <?php namespace App\Validators
, veja o código:
<?php namespace App\Validators;
use Carbon\Carbon;
class MinorDateThat
{
public function validate($attribute, $value, $parameters, $validator)
{
if (count($parameters) === 0)
throw new \Exception("Parameter name not reported");
$param = $parameters[0];
$minorDate = Carbon::createFromFormat("d/m/Y", $value);
$greaterDate = Carbon::createFromFormat("d/m/Y", $this->getParamValue($validator->getData(), $param));
return ($minorDate && $greaterDate && ($minorDate->lessThanOrEqualTo($greaterDate)));
}
protected function getParamValue($data, $param)
{
if (in_array($param, array_keys($data)))
return $data[$param];
throw new \Exception("Not informed value");
}
}
Após essa criação de arquivo vai na pasta app\Providers
abra o arquivo AppServiceProvider.php
e no seu método boot()
acrescente esse código:
<?php namespace App\Providers;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
Validator::extend('minordate','\App\Validators\MinorDateThat@validate');
}
public function register()
{
}
}
e preste atenção também nos use
que tem que existir que no caso é o use Illuminate\Support\Facades\Validator;
para que você possa usar o método extend
como demostrado no código, e isso serve para registrar esse novo jeito de validar um dado na sua tela.
Pronto agora é na parte do Validator
você deve configurar o nome minordate
e seu parâmetro que é o nome do outro campo a ser utilizado para a comparação de data.
Exemplo v.blade.php
@extends('_layout')
@section('content')
<h3 class="page-header">Verificação de Datas</h3>
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<div class="table-responsive">
<form action="{{route('data.store')}}" method="post" enctype="multipart/form-data">
<input type="hidden" name="_token" value="{{{ csrf_token() }}}"/>
<div class="form-group">
<label for="datai" class="label-primary">Data Inicial</label>
<input type="text" class="form-control" name="datai" id="datai" value="{{old('datai')}}" />
</div>
<div class="form-group">
<label for="dataf" class="label-primary">Data Final</label>
<input type="text" class="form-control" name="dataf" id="dataf" value="{{old('dataf')}}" />
</div>
<div>
<button class="btn btn-block btn-success">Enviar</button>
</div>
</form>
</div>
@endsection
nesse v.blade.php
tem duas datas a datai e a dataf quero que a datai
seja menor ou igual a dataf
e no código do Controller
segue:
public function store(Request $request)
{
$rules = [
'datai' => 'required|date_format:d/m/Y|minordate:dataf',
'dataf' => 'required|date_format:d/m/Y'
];
$messages = [
'datai.required' => 'Data inicial é requerida',
'datai.date_format' => 'Data inicial está em formato inválido',
'datai.minordate' => 'Data inicial tem que ser menor que data final',
'dataf.required' => 'Data final é requerida',
'dataf.date_format' => 'Data final está em formato inválido',
];
Validator::make($request->all(), $rules, $messages)->validate();
return 'Ok';
}
ou seja, minordate:dataf
está validando se a data é menor ou igual a dataf
. Isso eu fiz de acordo com você precisava talvez ajustes a serem feitos mediante suas regras de negócio, mas, isso resolve essa parte.
No Laravel existe até after:date
que é uma validação após o problema é que essa validação tem um formato especifico e para data em formato do Brasil pode dar problema em alguns tipos de data …