Blog EspecializaTi
Carlos Ferreira Por: Carlos Ferreira Comentar

Validar Enum Laravel

Validar enum Laravel

É muito comum desenvolver uma aplicação e no momento de validar precisar inserir um valor pré-definido, como por exemplo, em uma tabela que tem uma coluna chamada “status” do tipo ENUM que só recebe valores “A” ou “I”.

Quando delega essa parte para o usuário informar os status através de um “select”, por exemplo, o usuário pode adicionar de forma muito simples um novo

Se não validar o que acontece?
Gera erro!

Porém, o Validator do Laravel tem recursos para validar campos enum, é possível verificar se o valor informado está dentro de um range de opções.

Essa mesma validação é importante para “status (A,I)”, “estados (GO, SP, RJ, BA, …)”, “sexo (F,M)” e etc.

Neste exemplo vamos utilizar um Form Request Validation para conter as regras de validação, e vamos validar a questão do cadastro de um novo post.
Para criar uma nova classe de validação (Form Request Validation) rode este comando:

php artisan make:request StorePostFormRequest

Agora que criou a nossa nova classe de validação em app/Http/Requests/StorePostFormRequest no método authorize() dê um retorno de true, esse método authorize() é utilizado para verificar se o usuário tem permissão de fazer essa operação, é algo relacionado a ACL (níveis de acesso) do Laravel, isso não entra em questão por enquanto. Apenas retorne true:

public function authorize()
{
    return true;
}

Dentro do método rules() retorne um Array com as regras de validação para os campo.
Neste caso, vamos validar o valor do campo “status” se é igual aos valores permitidos: “published”, “draft”, “scheduled” e “excluded”.

Para validar campos enum no Laravel pode simplesmente utilizar a Facade Rule, e no método estático in() informar os valores que são aceitos. Exemplo:

Rule::in(['published', 'draft', 'scheduled', 'excluded'])

Agora vamos validar todos os campos, para garantir a entrada de dados coerente com as limitações do banco de dados, veja como fica o método rules():

public function rules()
{
    // Não esquece de usar a Facade Rule: use Rule;
    return [
        'title'         => 'required|min:3|max:100',
        'description'   => 'required|min:10|max:20000',
        'date'            => 'required|date',
        'status'        => [
            'required',
            Rule::in(['published', 'draft', 'scheduled', 'excluded']),
        ],
    ];
}

Nesse exemplo de validação o campo “status” é de preenchimento obrigatório e só aceita os valores informando no Array do método método in(), se o usuário agir de “má fé” adicionando novas opções ao “select” não vai conseguir gerar erro em nosso sistema.

 
 

Uma Opção Interessante de Validar:

Um outro adicional de melhoria neste exemplo, é levar essas opções para o Model correspondente, neste caso a classe Post (app/Models/Post.php). Basta criar um atributo ou método que retorna essa opções.

Particularmente gosto mais de criar um método, porque nele posso adicionar opção de passar um valor opcional como parâmetro para retornar o valor, veja o exemplo:

public function status($status = null)
{
    $opStatus = [
        'published' => 'Publicado',
        'draft'      => 'Rascunho',
        'scheduled'    => 'Agendado',
        'excluded'    => 'Excluído',
    ];

    if (!$status)
        return $opStatus;
    
    return $opStatus[$status];
}

Se simplesmente chamar o método status() da classe Post vai retornar um array com os status e opções, para retornar o nome do status pode passar o parâmetro com o nome do status, exemplo: status(‘published’) => ‘Publicado’

Para utilizar as opções de status em no model Post, podemos fazer assim:

// Não esqueça de usar a classe Post, ex: use App\Models\Post;
// $post é um objeto de Post, porque o Laravel faz o Dependency Injection (DI) automático
public function rules(Post $post)
{
    // Não esquece de usar a Facade Rule: use Rule;
    return [
        'title'         => 'required|min:3|max:100',
        'description'   => 'required|min:10|max:20000',
        'date'            => 'required|date',
        'status'        => [
            'required',
            Rule::in( array_keys($post->status()) ),
        ],
    ];
}

Ao fazer array_keys($post->status()) retorna apenas os keys (chaves) do array, no caso apenas os valores permitidos: “published”, “draft”, “scheduled” e “excluded”

A vantagem deste segundo módulo é porque além de centralizar as opções no Modelo (Post), fica mais simples e fácil de adicionar novas opções de status, caso seja necessário.

Espero que tenha gostado, qualquer dúvida só deixar aquele comentário! 🙂

 

Abraços []’s

 
 

Carlos Ferreira

Sobre o Autor:

Carlos Ferreira

Carlos Ferreira é Analista de Sistemas Experiente, Empreendedor, Fundador da empresa EspecializaTi. Certificações: Comptia Linux +, LPI, Novell Certification.

Todos os direitos reservados © 2018 - EspecializaTi. É proibida a reprodução total ou parcial deste conteúdo.