Páginas

lunes, 18 de mayo de 2015

Validaciones avanzadas en Laravel 4.2

Quería compartirles este pedazo de código de ejemplo que tal vez salve a más de uno de un aprieto.

Imaginensé que tienen una tabla de viajes y una tabla de pasajes. Los asientos dentro de la tabla de pasajes se pueden repetir pero no para el mismo viaje. Las reglas de laravel nos quedan chicas y acá hay una posible solución, crear una función que modifique las reglas dinámicamente pasando parámetros desde el controlador. (valido solo el asiento)

<?php
public static $rules = [
            'create' => [
                'asiento_id' => 'required|unique:pasajes,asiento_id,null,asiento_id,viaje_id,:id'
            ],
            'update' => [
                'asiento_id' => 'required|unique:pasajes,asiento_id,:idasiento,asiento_id,viaje_id,:idviaje'
            ]
        ];
        

public static function rules( $action, $merge=[], $id=false, $search=':id')
        {
            $rules = static::$rules[$action];
            if ($id) {
                foreach ($rules as &$rule) {
                    $rule = str_replace($search, $id, $rule);
                }
            }
            return array_merge( $rules, $merge );
        }
?>

Entonces desde el controlador podemos validar


<?php
$validator = Validator::make($data, Pasajes::rules('create', [], $data['viaje_id']));
?>
Y la función reemplazará :idviaje por el código del viaje en el string de validación.
Lo mismo si queremos pasar más de un parámetro ya que str_replace admite remplazar arrays.


<?php
$validator = Validator::make($data, Pasajes::rules('update', [], array($data->pasajero_id, $data->viaje_id, $data->asiento_id), array(':idpasajero', ':idviaje', ':idasiento'))); 
?>
Solamente hay que tener cuidado con el orden en los array.

saludos!!

No hay comentarios.: