Agora, mais do que nunca, é fundamental que os dados em seus aplicativos sejam válidos e precisos, e cumpram todos os requisitos do sistema. Isso atende à necessidade de manter a consistência dos dados e de evitar vulnerabilidades de segurança.

O Laravel torna a validação de dados fácil e intuitiva. Ele segue uma arquitetura MVC (Model View Controller) e requer apenas conhecimento geral de PHP e conceitos de programação orientada a objetos (OOP). Além disso, o Laravel oferece vários métodos para validar os dados recebidos.

Explore algumas dessas abordagens e como aplicar regras de validação ao seu conjunto de dados.

Validação de dados facilitada no Laravel

O Laravel fornece várias regras de validação prontas para uso quando os usuários do seu aplicativo enviam dados por meio de formulários. Você pode marcar os campos de entrada como obrigatórios, definir um comprimento mínimo ou máximo e exigir entradas exclusivas (não duplicadas) e endereços de e-mail válidos. O validador do Laravel verifica se a entrada satisfaz essas regras ou quaisquer outras que você especificar.

Essas regras de validação do Laravel incluem:

  • required – Os dados do campo não podem ser nulos ou vazios.
  • array – Os dados do campo devem ser um array PHP.
  • bail – A regra de validação para de ser executada depois de encontrar sua primeira falha de validação.
  • email – O dado no campo deve ser um endereço de e-mail válido.
  • unique – Os dados no campo não podem ter duplicatas na tabela do banco de dados.

Todos os métodos de validação têm prós e contras, mas a variedade deles permite que você escolha a melhor abordagem para suas necessidades. Dependendo do método que você escolher, a validação do Laravel pode ocorrer de várias maneiras, com mensagens de erro manuais ou automáticas.

O método mais comum é code>validate, usado para solicitações HTTP de entrada. Esse método é encadeado aos dados da solicitação, executando as regras de validação. Você pode separar as regras de cada campo com vírgulas, como aparece no exemplo abaixo.

use IlluminateHttpRequest;
 
public function store (Request $request){
  $validated = $request->validate([
        'email' => ['required, unique:users, email, bail'],
        'name' => ['required'],
    ]);

}

Aqui, email é uma entrada obrigatória, o que significa que não pode ser nula. Além disso, ele deve ser exclusivo na tabela do banco de dados users, garantindo que o mesmo endereço de e-mail não seja registrado duas vezes. A última regra determina também que o endereço de e-mail deve ser válido. Caso contrário, o processo de validação será interrompido. O campo name é obrigatório, mas não tem outras regras.

Se alguma regra de validação do Laravel falhar, uma resposta será gerada automaticamente.

Noções básicas de validação

Para entender melhor os métodos de validação, considere o exemplo a seguir. Você definirá uma rota para o endpoint e criará um controlador para validar e processar os dados da solicitação.

Primeiro, crie um endpoint simples, que permita aos usuários armazenar seus e-mails e senhas.

Definindo a rota

As rotas do Laravel são definidas no arquivo routes/web.php para um aplicativo web ou routes/api.php para uma API. Para este exemplo, use api.php:

use AppHttpControllersUserController;
 
Route::post('/store', [UserController::class]);

Criando o controlador

Execute este comando do Artisan para criar o controlador:

php artisan make:controller

UserController

Esse comando cria um arquivo UserController.php no diretório app/Http/Controllers.

Agora, defina um método store para validar os dados que entram no endpoint do armazenamento antes de armazená-los.

Neste exemplo, você validará os seguintes campos usando estas regras:

  • email  — Deve ser exclusivo, um e-mail válido, e ser obrigatório.
  • password — Deve ter um comprimento mínimo, confirmação de senha, e ser obrigatória.
  • age — Deve ser um número, e ser obrigatória.
<?php

namespace AppHttpControllers;
use IlluminateHttpRequest;
class UserController extends Controller
{
    /**
     * Store new user details.
     *
     */
    public function store(Request $request){
        $validated = $request->validate([
            'email' => 'required|unique:users|email',
            'age' => 'required|numeric',
            'password' => 'required|min:7|confirmed'
        ]);
        // After user data is validated, logic to store the data
    }

}

A regra confirmed permite que você exija um determinado campo duas vezes para verificar se os dados são precisos, como no caso de usuários que reinserem suas senhas durante o registro. Essa regra exige um campo chamado password_confirmation, cujos dados devem corresponder ao campo password.

Exibir mensagens de erro

Se os critérios de validação forem atendidos, seu código continuará sendo executado normalmente. Se a validação falhar, uma exceção IlluminateValidationValidationException será lançada e a resposta de erro apropriada será retornada.

O exemplo é baseado em uma API que retorna uma resposta HTTP 422 Unprocessable Entity no formato JSON. Para aplicativos da web, ele redirecionaria para a URL anterior para exibir a mensagem de erro, e os dados da solicitação seriam exibidos na sessão.

Você pode usar a variável $errors em suas exibições para mostrar os erros retornados:

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

Você também pode optar por exibir apenas o primeiro erro ou fazer um loop para exibir todos eles.

// Fetch all errors
$errors->all()

// Fetch only the first error
$errors->first()

Repopular formulários

Repopular formulários evita que os usuários precisem digitar novamente todas as informações, para que possam se concentrar na correção dos erros. Por exemplo, na falha de um endereço de e-mail, você pode preencher novamente o restante do formulário chamando o valor antigo do campo name.

$name = $request-> old('name')

//Blade helper
<input type="text" name="name" value="{{ old('name') }}">

Essa regra retornaria null se não houvesse nenhuma entrada anterior.

Validação avançada

O Laravel oferece outro método de escrever validações, chamado solicitações de formulário. Uma solicitação de formulário é uma classe de solicitação personalizada que organiza as validações e limpa o seu controlador.

Elas têm sua própria lógica de validação e autorização, adequada para grandes volumes de entrada, e podem ser usadas para definir regras de validação e personalizar mensagens de erro.

Para criar uma solicitação de formulário, execute este comando do Artisan:

php artisan make:request StoreUserRequest

Esse comando cria um arquivo StoreUserRequest.php no diretório app/Http/Requests e contém dois métodos padrão:

  • rules retorna regras de validação para os dados da solicitação.
  • authorize retorna um booleano para indicar se o usuário tem permissão para executar a ação solicitada.

Converta o exemplo anterior para usar uma solicitação de formulário.

<?php

namespace AppHttpRequests;
use IlluminateFoundationHttpFormRequest;
class StoreUserRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        // Add logic to check if the user is authorized to submit this data.
        return true;
    }
    /**
     * Get the validation rules that apply to the request.
     *
     * @return array<string, mixed>
     */
    public function rules()
    {
        return [
            'email' => 'required|unique:users|email',
            'age' => 'required|numeric',
            'password' => 'required|min:7|confirmed'
        ];
    }

}

Para personalizar as mensagens de erro dessas regras, você pode substituir o método messages na classe FormRequest.

/**

     * Get the error messages for the defined validation rules.
     *
     * @return array
     */
    public function messages()
    {
        return [
            'email.required' => 'An email address is required',
            'email.email' => 'The email address must be valid',
            'password.confirmed'=>'Re-type your password as 
password_confirmation, passwords does not match'
        ];

    }

Observação: O nome dos dados e a regra de validação são separados por um ponto (.) antes dos dados da mensagem.

Validação personalizada

Para criar uma validação personalizada, você pode usar um facade Validator em vez de validate. A instância do validador contém dois argumentos: os dados a ser validados e um array de regras de validação. Esses dois argumentos são passados para o método ::make do facade validador, gerando uma nova instância de validador.

use IlluminateHttpRequest; 

public function store (Request $request){
        $validator = Validator::make($request->all(),[
            'email' => 'required|unique:users|email',
            'age' => 'required|numeric',
            'password' => 'required|min:7|confirmed'
        ]);
        if ($validator->fails()) {
            // Return errors or redirect back with errors
            return $validator->errors();
        }
 
        // Retrieve the validated input...
        $validated = $validator->validated();
        // Continue logic to store the data

    }

Se quiser adicionar um direto automático, você pode executar o método validate em uma instância de validador preexistente. Se a validação falhar, uma solicitação XHR produzirá uma resposta JSON com 422 Unprocessable Entity como código de status, ou o usuário será redirecionado imediatamente.

$validator = Validator::make($request->all(),[
'email' => 'required|unique:users|email',
'password' => 'required|min:7|confirmed'
])->validate();

Você também pode personalizar suas mensagens de erro passando um terceiro argumento chamado messages para Validate::make method:

$validator = Validator::make($request->all(),[
            'email' => 'required|unique:users|email',
            'age' => 'required|numeric',
            'password' => 'required|min:7|confirmed'
        ], $messages = [
            'required' => 'The :attribute field is required.',
]);

Observação: O :attribute é substituído pelo nome do campo em validação.

Resumo

Validar os dados é fundamental para manter seu conjunto de dados limpo, correto e completo. A validação de dados permite que você elimine erros nos dados que poderiam corromper ou de alguma maneira impactar o seu projeto. A validação se torna tanto mais importante quanto mais aumenta a escala do trabalho, com quantidades cada vez maiores de dados.

O Laravel permite várias abordagens flexíveis para garantir a integridade e a precisão dos dados que passam pelo seu aplicativo. Você pode obter uma lógica de validação complicada com métodos padrão ou personalizáveis, tornando sua base de código bem estruturada e mais reutilizável.

Lance seus aplicativos Laravel mais rapidamente com os serviços de hospedagem de aplicativos da Kinsta.

Jeremy Holcombe Kinsta

Editor de Conteúdo & Marketing na Kinsta, Desenvolvedor Web WordPress e Escritor de Conteúdo. Fora do universo WordPress, eu curto praia, golfe e filmes. Também enfrento problemas de gente alta ;).