La validación es una característica de los modelos Laravel Eloquent que garantiza que los modelos cumplan con sus criterios de validación antes de guardarlos. Si no se consideran válidos el modelo no se guardará y los errores de validación estarán disponibles.
La validación permite múltiples conjuntos de reglas, inyectando el ID del modelo en reglas de validación unique
y generando excepciones en validaciones fallidas. Es pequeño y flexible para adaptarse perfectamente a su flujo de trabajo y ayudarle a guardar únicamente datos válidos.
¿Quiere utilizar la validación en Laravel 4.2+? Eche un vistazo a la rama 0.10.x para obtener documentación e instrucciones de instalación.
La versión Laravel 4.2 es más adecuada para realizar la validación de formularios; admite mensajes de validación personalizados, reglas de confirmación y múltiples conjuntos de reglas. Debido a que Laravel 5.0 tiene validación FormRequest
la validación ahora está diseñada para mantener válidos sus datos principales y dejar la validación del formulario al marco.
¿Quiere utilizar la validación en Laravel 5.0 a 5.2? Eche un vistazo a la rama 2.x para obtener documentación e instrucciones de instalación.
La versión Laravel 5.0 - 5.2 utilizó un contrato ValidationException
desde entonces obsoleto del marco de Laravel. Para Laravel 5.3 ahora ampliamos la validación principal ValidationException
, lo que significa que el marco redirigirá automáticamente con errores cuando ocurra un error de validación, de manera muy similar a como lo haría FormRequest
.
Sigue leyendo: ¡estas instrucciones son para ti!
Simplemente vaya al directorio de su proyecto donde se encuentra el archivo composer.json
y escriba:
el compositor requiere watson/validación
Vea las instrucciones de instalación para Laravel 4.2+. Vea las instrucciones de instalación para Laravel 5.0 - 5.2.
Primero, agregue el rasgo a su modelo y agregue sus reglas y mensajes de validación según sea necesario.
utilice WatsonValidatingValidatingTrait; la clase Post extiende Eloquent { use ValidatingTrait; protegido $reglas = [ 'título' => 'requerido', 'slug' => 'requerido|único:publicaciones,slug', 'contenido' => 'requerido' ]; }
También puede agregar el rasgo a un BaseModel
si está usando uno y funcionará en todos los modelos que se extienden a partir de él; de lo contrario, puede simplemente extender WatsonValidatingValidatingModel
en lugar de Eloquent
.
Nota: deberá establecer la propiedad $rules
en cualquier modelo que se extienda desde un BaseModel
que use el rasgo o, de lo contrario, establecer una matriz vacía como $rules
para BaseModel
. Si no lo hace, inevitablemente terminará con LogicException with message 'Relationship method must return an object of type IlluminateDatabaseEloquentRelationsRelation'
.
Ahora tienes acceso a algunas funciones agradables.
// Comprobar si el modelo es válido o no.$post->isValid(); // verdadero// O comprobar si no es válido o no.$post->isInvalid(); // false// Una vez que hayas determinado la validez del modelo,// podrás obtener los errores.$post->getErrors(); // bolsa de mensajes de errores
La validación del modelo también se vuelve realmente sencilla.
if (! $post->save()) {// Ups.return redirección()->ruta('posts.create') ->withErrors($post->getErrors()) ->conEntrada(); }retorno de redirección()->ruta('posts.show', $post->id) ->withSuccess("Tu publicación se guardó correctamente.");
De lo contrario, si prefiere utilizar excepciones al validar modelos, puede utilizar el método saveOrFail()
. Ahora, se generará una excepción cuando intente guardar un modelo no válido.
$post->saveOrFail();
No es necesario detectar la excepción si no lo desea. Laravel sabe cómo manejar una ValidationException
y redirigirá automáticamente con entradas de formulario y errores. Si quieres manejarlo tú mismo, puedes hacerlo.
prueba {$post->saveOrFail(); } catch (WatsonValidatingValidationException $e) {$errores = $e->getErrors();returndirection()->ruta('posts.create') ->conErrores($errores) ->conEntrada(); }
Tenga en cuenta que puede simplemente pasar la excepción al método withErrors()
como withErrors($e)
y Laravel sabrá cómo manejarlo.
Si está utilizando el modelo y desea realizar un guardado que omita la validación, puede hacerlo. Esto devolverá el mismo resultado que si llamara save()
en un modelo sin el rasgo.
$post->forceSave();
Si prefiere que se generen excepciones de forma predeterminada al usar el método save()
en lugar de tener que usar saveOrFail()
puede establecer la siguiente propiedad en su modelo o BaseModel
.
/** * Si el modelo debe generar una ValidationException si * falla la validación. Si no se establece, el valor predeterminado será falso. * * @var boolean */protected $throwValidationExceptions = true;
Si desea realizar un guardado único utilizando excepciones o valores de retorno, puede utilizar los métodos saveOrFail()
y saveOrReturn
.
Para mostrar mensajes de error de validación personalizados, simplemente agregue la propiedad $validationMessages
a su modelo.
/** * Mensajes de validación que se pasarán al validador. * * @var array */protected $validationMessages = ['slug.unique' => "Otra publicación ya está usando ese slug."];
Es posible que hayas notado que estamos usando la regla unique
en el slug, que no funcionaría si estuviéramos actualizando un modelo persistente. Afortunadamente, Validación se encargará de esto por usted y agregará la clave principal del modelo a la regla para que la regla funcione como se espera; ignorando el modelo actual.
Puede ajustar esta funcionalidad configurando la propiedad $injectUniqueIdentifier
en su modelo.
/** * Si el modelo debe inyectar su identificador en las * reglas de validación únicas antes de intentar la validación. Si esta propiedad * no está configurada en el modelo, el valor predeterminado será verdadero. * * @var boolean */protected $injectUniqueIdentifier = true;
Desde el primer momento, admitimos la regla unique
proporcionada por Laravel. También admitimos la popular regla felixkiss/uniquewith-validator, pero deberás suscribirte. Simplemente agregue use WatsonValidatingInjectorsUniqueWithInjector
después de haber importado el rasgo de validación.
Si lo desea, también es fácil admitir reglas de inyección adicionales. Supongamos que desea admitir una regla adicional que ha llamado unique_ids
que simplemente toma la clave principal del modelo (por cualquier motivo). Solo necesita agregar una regla en formato camel que acepte cualquier parámetro existente y el nombre del campo, y devuelva la regla de reemplazo.
/** * Prepare una regla Unique_ids y agregue un identificador de modelo si es necesario. * * @param matriz $parámetros * @param cadena $campo * @return cadena */función protegida prepareUniqueIdsRule($parámetros, $campo) {// Solo realice un reemplazo si el modelo ha persistido.if ($this->exists) {return 'unique_ids:' . $this->getKey(); }return 'unique_ids'; }
En este caso, si el modelo se ha guardado y tiene una clave principal de 10
, la regla unique_ids
se reemplazará con unique_ids:10
.
El rasgo activa varios eventos durante el proceso de validación a los que puede conectarse para impactar el proceso de validación.
Para conectarse, primero debe agregar la propiedad $observeables
a su modelo (o modelo base). Esto simplemente le permite a Eloquent saber que su modelo puede responder a estos eventos.
/** * Eventos observables expuestos por el usuario * * @var array */protected $observables = ['validating', 'validated'];
Cuando la validación esté a punto de ocurrir, se activará el evento eloquent.validating: ModelName
, donde el parámetro $event
se saving
o restoring
. Por ejemplo, si estuviera actualizando un modelo de espacio de nombres AppUser
el evento sería eloquent.validating: AppUser
. Si escucha cualquiera de estos eventos y devuelve un valor, puede evitar que se produzca la validación por completo.
Event::listen('eloquent.validating:*', function($model, $event) {// Validación de la pseudoruleta rusa.if (rand(1, 6) === 1) {return false; } });
Después de que se produce la validación, también hay una variedad de eventos validated
a los que puede conectarse, para los eventos passed
, failed
y skipped
. Para el ejemplo anterior que falla en la validación, podría obtener el evento eloquent.validated: AppUser
.
Actualmente hay un error en Laravel (consulte el número 1181) que impide que los eventos del modelo se activen más de una vez en un conjunto de pruebas. Esto significa que la primera prueba que utiliza pruebas modelo pasará, pero las pruebas posteriores fallarán. Hay un par de soluciones temporales enumeradas en ese hilo que puedes usar para hacer que tus pruebas pasen mientras tanto.
Dado que Laravel cambió a Liferaft con el fin de rastrear errores y solicitudes de extracción, es posible que el problema mencionado anteriormente no esté disponible. Este Gist tiene un ejemplo TestCase.php
que le muestra cómo restablecer los eventos de todos sus modelos entre pruebas para que funcionen como se esperaba.
Hay varias formas de utilizar el modelo de validación en sus controladores; sin embargo, aquí hay un ejemplo que utiliza el nuevo FormRequest en Laravel 5 (si desea ver otro ejemplo de controlador sin FormRequest, consulte la versión 4.2+ de este paquete.
Este ejemplo mantiene su código limpio al permitir que FormRequest maneje la validación de su formulario y que el modelo maneje su propia validación. Al habilitar las excepciones de validación, puede reducir el código de controlador repetitivo (bloques try/catch) y manejar las excepciones de validación de modelos globalmente (sus solicitudes de formulario deben mantener sus modelos válidos, por lo que si su modelo deja de ser válido, es un evento excepcional ).
<?php espacio de nombres AppHttpControllers;use AppHttpRequestsPostFormRequest;use IlluminateRoutingController;la clase PostsController extiende el controlador {publicación $ protegida; función pública __construct (publicación $ publicación) {$esta->publicación = $publicación; }// ...almacenamiento de funciones públicas(PostFormRequest $solicitud) {// La publicación generará una excepción si no es válida.$post = $this->post->create($request->input());// La publicación se guardó correctamente.returndirect()->route( 'publicaciones.mostrar', $publicación); } }
Luego puede detectar una excepción de validación del modelo en su app/Exceptions/Handler.php
y tratarla según sea necesario.
función pública render ($ solicitud, excepción $ e) {if ($e instanciade WatsonValidatingValidationException) {regresar()->withErrors($e)->withInput(); }padre::render($solicitud, $e); }