Pesquise

3 de jan. de 2016

Validação personalizada no Laravel 5.2

Pesquisei vários métodos de implementar uma validação personalizada, mas vários deles dizem para registrar o método em algum ServiceProvider, sem falar nas mensagens de erro. A documentação do Laravel também não ajuda, tratando o tópico bem brevemente.

Eu estava procurando algo que não precisasse mudar vários arquivos, e que a validação não ficasse em outra classe além da Request que criei para a validação. Assim, apresento a solução que encontrei.

Assumindo que você está fazendo a validação através de um Form Request, além dos métodos tradicionais authorize() e rules(), você pode criar seu método de validação personalizado, e sobrescrever o método getValidatorInstance() da classe Request para adicionar seu método no procedimento de validação.

Vamos supor que no nosso formulário temos um campo numero_par que, como o nome sugere, deve ser um número par. Criamos então nosso método de validação na nossa classe FormularioRequest:

public function validatePar($validator)
{
    if( $this->numero_par % 2 != 0 )    // se o número não for par
    {
        $validator->errors()->add('numero_par', 'Insira um número par');
    }
}

Sobrescrevemos então o método getValidatorInstance():

public function getValidatorInstance()
{
    $validator = parent::getValidatorInstance();

    // Validação personalizada
    $validator->after(function () use ($validator)
    {
        $this->validatePar($validator);
    });

    return $validator;
}

Nossa classe completa ficaria então como:

<?php

namespace App\Http\Requests;

use App\Http\Requests\Request;
use Validator;

class FormularioRequest extends Request
{
    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        return [
            'numero_par'    => 'required|numeric',
        ];
    }

    public function getValidatorInstance()
    {
        $validator = parent::getValidatorInstance();

        // Validação personalizada
        $validator->after(function () use ($validator)
        {
            $this->validatePar($validator);
        });

        return $validator;
    }
    
    public function validatePar($validator)
    {
        if( $this->numero_par % 2 != 0 )    // se o número não for par
        {
            $validator->errors()->add('numero_par', 'Insira um número par');
        }
    }
}

Note que, diferente das outras formas de adicionar uma validação personalizada, esta aqui não registra uma regra de validação para você usar no array de regras. Este método se torna útil quando você deseja executar uma operação específica de um model, principalmente se envolve outros campos do mesmo formulário.

10 de jun. de 2015

Alliance VLSI no Ubuntu

A suíte Alliance é um conjunto de ferramentas gratuitas para projeto VLSI, que inclui um compilador e um simulador VHLD, ferramentas de síntese lógica, e ferramentas de posicionamento e roteamento automáticos.

A versão para o Ubuntu contém alguns problemas, cujas soluções obtive ao estudar a distribuição dos arquivos no sistema e compará-los com a versão (funcional) disponível para o Fedora. Neste post estou utilizando o Lubuntu 14.04 LTS, mas acredito que os problemas e procedimentos se apliquem a outras versões e distros.

4 de jan. de 2014

Resolvendo problemas de codificação em PHP / MySQL / HTML

Como um dos trabalhos da disciplina de Especificação e Requisitos de Software do curso, foi dado um sistema em PHP para que fossem aplicadas modificações (adicionar ordenamento e filtro à uma tabela, criar um cadastro, etc).

Não sei se o sistema já estava assim, ou se foi porque foi desenvolvido em outro SO, mas ele estava com problemas de codificação (caracteres acentuados). Olhando o banco de dados através do phpMyAdmin, o texto parecia normal, mas na hora de transformar em HTML, as letras acentuadas não apareciam. Vi que o BD estava em UTF-8, e tentei setar a codificação do HTML, sem sucesso.