Neste artigo, vou focar na parte das validações de dados em formulários. Aproveitei também para atualizar tudo para o Laravel 5.7.

Voltando a nossa Série, finalizamos o último artigo falando sobre algumas implementações rápidas do Laravel Controller. Assim, neste artigo, vamos focar na parte das validações de dados em formulários no Laravel 5.7.

O que são as validações (validations) no Laravel 5.7

Primeiramente, o Laravel utiliza de diversas regras para conseguir validar qualquer dado que está entrando em uma aplicação. Estas regras são essenciais para que tenhamos mais segurança, controle, estabilidade e melhor usabilidade para o usuário.

Para isto ele utiliza, por padrão, a Classe “ValidateRequests”. Visto que ela traz métodos bem convenientes para validar requisições HTTP ao nosso controller, bem como retornar, para o Controller, o sucesso ou o erro, de acordo com a regra programada.

Criando a primeira validação

Colocando a mão na massa, vamos abrir o meu projeto com o Laravel 5.7. Neste exemplo, vou utilizar o “ProductsController” para configurar as validações.

Caso você não tenha acompanhado nossa série, deixo o link para nosso artigo sobre Controllers no Laravel. Nele mostro sobre a criação deste controller.

Aqui, iniciaremos uma validação simples dos dados que salvo na função store(). Aqui existem 2 maneiras:

A primeira é mais simples e você pode incluir no próprio Controller com a função $request->validate();

public function store(Request $request){    $validatedData = $request->validate([      'product_line_id' => 'required|integer',      'description' => 'required|alpha_num',      'expiration_time' => 'required|date',      'price' =>['required',     'regex:/^\d+([.,]\d{1,X})?$]/'] ]);    $data = [      'product_line_id' => request('product_line_id'),      'description' => request('description'),      'expiration_time' => request('expiration_time'),      'price' => request('price') ];    Product::create($data);    return back();  } 

Para a validação precisava instanciar a “Request” da função utilizando o type-hint. É através dela que faremos a validação. A partir daí, apenas chamamos a função validate() passando o array com todos os campos que validaremos e suas respectivas regras.

No caso, utilizamos as regras básicas de campo requerido e o tipo de dado que queremos que venha. No campo “price”, utilizei a regra de regex para validar o valor monetário. Já que não encontramos nada pronto do Laravel, buscamos na internet por um regex que fizesse isso.

Caso queira saber todas as validações que o Laravel 5.7 permite, siga para o fim deste artigo.

Como podem ver abaixo, é um simples regex que valida a virgula dos centavos. Mas, para não ter problemas de compatibilidade com outra regra, o regex exige a utilização de um array ao invés da simples string de regras.

'price' =>[   'required',   'regex:/^\d+([.,]\d{1,X})?$]/' ] 

A segunda forma é usando o Form Request Validation

Ela é relativamente mais complexa, mas também deixa suas validações mais organizadas.

Aqui, criaremos uma classe Request personalizada que terá estas mesmas regras. Para isto basta ir ao SSH do seu servidor. No caso, utilizamos nossa instância de hospedagem cloud e digitar o comando abaixo:

php artisan make:request StoreProduct

Agora, você verá na pasta Http do Laravel 5.7, uma pasta Requests com a classe StoreProduct.php.

namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; class StoreProduct extends FormRequest {   public function authorize() {       return true;   }   public function rules() {     return [       //     ];   } } 

Na função rules() adicionaremos as regras que haviamos colocado no Controller. O arquivo ficará assim então:

 public function rules() {   return [     'product_line_id' => 'required|integer',     'description' => 'required',     'expiration_time' => 'required|integer',     'price' =>['required','regex:/^\d+([.]\d{1,2})?$/']   ]; }

Com as regras definidas, basta fazer o type-hint  na função store() do Controller e tudo deve funcionar.

 // Adiciono a classe StoreProduct no começo do arquivo use App\Http\Requests\StoreProduct; ... // E então faço o type-hint na função store() public function store(StoreProduct $request){   $data = [     'product_line_id' => request('product_line_id'),     'description' => request('description'),     'expiration_time' => request('expiration_time'),     'price' => request('price')   ]; ... 

A partir daí, o Laravel já vai entender que a request que virá para esta função deverá passar pela validação do “StoreProduct”.

Imprimindo a validação para o usuário.

Apenas com a configuração anterior, não conseguiremos ver se alguma validação foi feita. Isto porque só veremos algum resultado imprimindo isto em uma view.

Mais pra frente apresentaremos melhor sobre as Views. Mas, por hora, criamos a view products.blade.php para adicionar um produto e validar os dados.


@if($errors->any())
@foreach($errors->all() as $error) {{ $error }} @endforeach
@elseif(session()->has('success'))
{{ session('success') }}
@endif
Adicionar um novo produto
{{csrf_field()}} Selecione uma linha de produto
@foreach($product_lines as $product_line) {{$product_line->description}} @endforeach
Enviar

Para relembrar, a view Products.blade.php foi vinculada a função index do “ProductsController” no artigo anterior. Agora, estamos efetivamente criando ele com o conteúdo acima.

Antes de explicar o código acima, vamos entender o fluxo do Form Request Validation no Laravel 5.7. Ao dar o type-hint do Form Request Validation na função do Controller, você está dizendo ao Laravel que esta validação será acionada antes de executar qualquer ação da função. Se os dados forem validados corretamente, o processo segue. Senão, o usuário é redirecionado automaticamente para a rota anterior. Neste caso, mostrando a view “Products”.

Agora voltando ao código da View. Nas primeiras linhas, verificamos se existe alguma coisa na variável $errors. (Variável já implementada pelo Laravel 5.7).

$errors->any() 

Se houver alguma coisa nele, fazemos a varredura de todos os erros e imprimimos na <li>.

<div class="error">   <ul>   @foreach($errors->all() as $error)     <li>{{ $error }}</li>   @endforeach   </ul> </div>

Se não houver nenhum erro, inserimos a mensagem de sucesso.

[html]@elseif(session()->has('success'))   <div class="success">       {{ session('success') }}   </div>   @endif [/html] 

Personalizando as mensagens da validação

Por fim, só precisamos editar mensagens personalizadas para os nossos erros. Para isto, adicionaremos a função messages() à classe “StoreProducts”.

 public function messages() {   return [     'required' => 'O campo :attribute é requerido',     'description.min' => 'O campo :attribute deve ter no mínimo 3 caracteres',     'expiration_time.min' => 'O campo :attribute deve ser a quantidade de dias',     'price.regex' => 'O campo :attribute deve conter um valor monetário. Ex.: 2.25',   ]; }

Como podemos ver no código acima, a função messages() apenas retorna um array com as mensagens específicas de cada regra. Para definir uma mensagem geral à uma regra, apenas utilizamos a regra como no exemplo:

// Defini que todo campo requerido deverá ter esta mensagem.  // A tag ':attribute' será substituída pelo nome do campo em questão. 'required' => 'O campo :attribute é requerido',

Para adicionar uma mensagem específica ao campo em questão, basta coloca o nome_do_campo.nome_da_regra.

Conclusão

Agora que conseguimos fazer as validações dos dados inseridos em nosso formulário, garantimos a integridade do banco e melhoramos a interação do usuário com cada tela.

Compartilhe:

Sobre o autor:

Sobre o autor:

Posts Relacionados:

Novidades do Blog

Deixe seu e-mail abaixo para passar a receber promoções e novidades do nosso Blog.