Menú
Gratis
Registro
hogar  /  Problemas/ Validación imprudente de php. Validado, validado... y validado! Comparando validadores de datos en PHP

Validación imprudente de php. Validado, validado... y validado! Comparando validadores de datos en PHP

Es muy esencial validar la entrada de su formulario antes de tomar los datos de envío del formulario para su posterior procesamiento. Cuando hay muchos campos en el formulario, el validación PHP el guión se vuelve demasiado complejo. Dado que está haciendo la misma validación o una similar para la mayoría de los formularios que crea, se gasta demasiado esfuerzo duplicado en las validaciones de formularios.

Acerca de este script genérico de validación de formulario PHP

Este script de validación de formulario PHP genérico hace que sea muy fácil agregar validaciones a su formulario.

Creamos y asociamos un conjunto de "descriptores de validación" con cada elemento del formulario. El "descriptor de validación" es una cadena que especifica el tipo de validación a realizar. Por ejemplo, "req" significa obligatorio, "alpha" significa permitir solo caracteres alfabéticos, etc.

Cada campo del formulario puede tener cero, una o más validaciones. Por ejemplo, la entrada no debe estar vacía, debe tener menos de 25 caracteres, debe ser alfanumérica, etc.

Puede asociar un conjunto de descriptores de validación para cada campo de entrada en el formulario.

Descargue el script de validación de formulario PHP

Puede descargar el script de validación del formulario PHP a continuación:
El archivo zip contiene el script de validación de formularios formvalidator.php, documentación y ejemplos de uso.

Usando el script de validación de formulario PHP

  1. Incluya formvalidator.php en su secuencia de comandos de procesamiento de formularios
  2. require_once "formulario.php"
  3. Cree un objeto FormValidator y agregue los descriptores de validación de formulario.
  4. $validador = new FormValidator(); $validator->addValidation("Nombre","req","Rellene el nombre"); $validator->addValidation("Correo electrónico","correo electrónico", "La entrada para Correo electrónico debe ser un valor de correo electrónico válido"); $validator->addValidation("Correo electrónico","requerido","Complete el correo electrónico");

    El primer argumento es el nombre del campo de entrada en el formulario. El segundo argumento es el descriptor de validación que indica el tipo de validación requerida. El tercer argumento es el mensaje de error que se mostrará si falla la validación.

  5. Valide el formulario llamando a la función ValidateForm()
  6. if(!$validator->ValidateForm()) ( echo " Errores de validación:"; $error_hash = $validador->GetErrors(); foreach($error_hash as $inpname => $inp_err) ( echo "

    $inpname: $inp_err

    \n"; ) )

ejemplo

El siguiente ejemplo aclarará la idea.

addValidation("Nombre","req","Rellene el nombre"); $validator->addValidation("Correo electrónico","correo electrónico", "La entrada para Correo electrónico debe ser un valor de correo electrónico válido"); $validator->addValidation("Correo electrónico","requerido","Complete el correo electrónico"); if($validator->ValidateForm()) ( echo "

¡Éxito de la validación!

"; $show_form=false; ) else ( echo " Errores de validación:"; $error_hash = $validador->GetErrors(); foreach($error_hash as $inpname => $inp_err) ( echo "

$inpname: $inp_err

\n"; ) ) ) if(true == $show_form) ( ?>

Nombre: Correo electrónico:

Adición de validación personalizada

Si desea agregar una validación personalizada, que no es proporcionada por los descriptores de validación, puede hacerlo. Aquí están los pasos:

  1. Cree una clase para la validación personalizada y anule la función DoValidate()
  2. class MyValidator extiende CustomValidator ( function DoValidate(&$formars,&$error_hash) ( if(stristr($formars["Comments"],"http://")) ( $error_hash["Comments"]="No se permiten URL en comentarios"; devuelve falso; ) devuelve verdadero; ) )

  3. Agregar el objeto de validación personalizado
  4. $validador = new FormValidator(); $validator->addValidation("Nombre","req","Rellene el nombre"); $validator->addValidation("Correo electrónico","correo electrónico", "La entrada para Correo electrónico debe ser un valor de correo electrónico válido"); $validator->addValidation("Correo electrónico","requerido","Complete el correo electrónico"); $validador_personalizado = new MiValidador(); $validador->AddCustomValidator($custom_validator);

La función de validación personalizada se llamará automáticamente después de otras validaciones.

Tabla de Descriptores de Validación

Aquí está la lista de todos los descriptores de validación:

Descriptor de validaciónUso
requerimientoEl campo no debe estar vacío.
maxlen=???comprueba al máximo la longitud de los datos introducidos. Por ejemplo, si el tamaño máximo permitido es 25, proporcione el descriptor de validación como "maxlen=25".
minlen=???verifica la longitud de la cadena ingresada al mínimo requerido. ejemplo "minlen=5"
alnumVerifique los datos si contienen otros caracteres que no sean caracteres alfabéticos o numéricos
alnum_sSolo permite caracteres alfabéticos, numéricos y de espacio
númeroComprobar datos numéricos
alfaConsultar datos alfabéticos.
alfa_sVerifique los datos alfabéticos y permita espacios.
correo electrónicoEl campo es un campo de correo electrónico y verifica la validez de los datos.
lt=???
menos que =???
Verifique que los datos sean menores que el valor pasado. Válido solo para campos numéricos.
ejemplo: si el valor debe ser inferior a 1000, proporcione una descripción de validación como "lt = 1000"
gt=???
mayor que=???
Verifique que los datos sean mayores que el valor pasado. Válido solo para campos numéricos.
ejemplo: si el valor debe ser mayor que 10, proporcione una descripción de validación como "gt = 10"
expresión regular =???Compruebe con una expresión regular que el valor debe coincidir con la expresión regular.
ejemplo: “regexp=^(1,20)$” permite hasta 20 caracteres alfabéticos.
no seleccionar=??Este descriptor de validación es para seleccionar elementos de entrada (listas). Normalmente, los cuadros de lista de selección tendrán un elemento que dice "Seleccionar uno". El usuario debe seleccionar una opción diferente a esta opción. Si el valor de esta opción es 'Seleccionar uno', la descripción de validación debe ser "no seleccionar = Seleccionar uno"
noseleccionarEste descriptor de validación es para casillas de verificación. El usuario no debe seleccionar la casilla de verificación dada. Proporcionar la valor de la casilla de verificación en lugar de ??
Por ejemplo, dontelectchk=on
deberíaseleccionarEste descriptor de validación es para casillas de verificación. El usuario debe seleccionar la casilla de verificación dada. Proporcione el valor de la casilla de verificación en lugar de ??
Por ejemplo, shouldselchk=on
noseleccionarradioEste descriptor de validación es para botones de opción. El usuario no debe seleccionar el botón de opción dado. Proporcione el valor del botón de opción en lugar de ??
Por ejemplo, dontelectradio=NO
selectradioEste descriptor de validación es para botones de radio. El usuario debe seleccionar el botón de radio dado. Proporcione el valor del botón de opción en lugar de ??
Por ejemplo, selectradio=yes
selmin=??Seleccione al menos n número de casillas de verificación de un grupo de casillas de verificación.
Por ejemplo: selmin=3
soloHace obligatorio un grupo de radio. El usuario debe seleccionar al menos un elemento del grupo de radio.
eqelmnt=???compare dos elementos en el formulario y asegúrese de que los valores sean los mismos. Por ejemplo, 'contraseña' y 'confirmar contraseña'. Reemplace la ??? con el nombre del otro elemento de entrada.
Por ejemplo: eqelmnt=confirm_pwd

En el artículo anterior, prometí escribir una comparación de mi propia biblioteca con otras soluciones disponibles, así que hoy veremos la validación usando Aura.Filter, Respect Validation, Sirius Validation y Valitron.


Imaginemos que tenemos un servicio público en desarrollo que consiste en registrar usuarios para Acceso completo a todas las funciones. Así, el formulario de registro contendrá los siguientes campos:

  1. nombre. Debe contener exactamente dos palabras, donde la primera es el nombre del usuario y la segunda es el apellido.
  2. acceso. Si se pasa un valor, debe contener solo letras latinas, guiones y guiones bajos.
  3. correo electrónico. Debe contener una dirección válida Correo electrónico.
  4. contraseña. Debe estar instalado y no más de 64 caracteres.
  5. acordado. Una casilla de verificación típica que el usuario debe marcar para confirmar su acuerdo con los términos del servicio.

Entonces, tenemos cinco campos que el usuario debe completar para registrarse en nuestro servicio imaginario. Imaginemos que recibimos datos completamente inválidos como entrada:


$data = [ "name" => "Albert", // Deberían ser dos palabras "login" => "@lbert", // Carácter "Prohibido" @ "email" => "algo va mal", // Esto debería ser correo electrónico "contraseña" =>

Aura.Filtro

La validación con Aura.Filter comienza con una fábrica de filtros. Necesitamos crear un llamado "filtro de sujeto", ya que validaremos una matriz, no un valor individual.

Definición de las reglas

use Aura\Filter\FilterFactory; $filtro = (nueva FilterFactory)->newSubjectFilter(); $filter->validate("nombre") ->isNotBlank() ->is("two_words") ->setMessage("El nombre debe tener dos palabras"); $filter->validate("iniciar sesión") ->isBlankOr("alnum") ->setMessage("Si especifica un inicio de sesión, debe contener solo caracteres latinos"); $filter->validate("correo electrónico") ->isNotBlank() ->is("correo electrónico") ->setMessage("Ingrese una dirección de correo electrónico válida"); $filter->validate("contraseña") ->isNotBlank() ->is("strlenMax", 64) ->setMessage("Ingrese una contraseña"); $filtro->validate("aceptado") ->is("devolución de llamada", function($asunto, $campo) ( return $asunto->($campo) === verdadero; ))->setMessage("Necesitas estoy de acuerdo con los términos del servicio.");

Como puede ver, la descripción de las reglas es bastante simple. Aura.Filter proporciona un conjunto completo de reglas útiles listas para usar, y algunas de ellas se usaron en el ejemplo anterior:

  1. método no está en blanco. Especifica que el campo no puede ser nulo.
  2. alnum. Esta regla solo permite letras latinas.
  3. correo electrónico. Y tan claro :)
  4. strlenMax. Especifica que el campo no puede exceder la longitud especificada por el segundo argumento del método is.
  5. llamar de vuelta. Este tipo de regla es similar a los cierres de Kontrolio. Te permite definir una regla como un cierre. En este cierre, Aura.Filter pasa "asunto", nuestra matriz de datos del formulario, y un campo, en este caso acordado.

Es posible que haya notado que no especifiqué la regla de dos_palabras. Naturalmente, no existe tal regla en Aura.Filter, por lo que debemos crearla. Como dice la documentación, esto se hace con una clase separada para la regla:


/** * La regla que valida el nombre de usuario. * El nombre de usuario consta de dos palabras: nombre y apellido, separados por un espacio. */ class UserNameRule ( /** * Valida el nombre de usuario. * * @param object|array $subject * @param string $field * @param int $max * * @return bool */ public function __invoke($subject, $field , $max = null) ( $value = $subject->($field); if (! is_scalar($value)) ( return false; ) return (bool) preg_match("/^+\s+$/u", $valor); ) )

El segundo paso es informar a la fábrica de filtros sobre nuestra nueva regla. Se hace pasando el primer argumento como una matriz de reglas a la fábrica de filtros:


El siguiente paso es avisar a Aura.Filter que hemos creado una nueva regla y queremos usarla. Esto se hace pasando una serie de reglas al primer argumento de fábrica:


use Aura\Filter\FilterFactory; $reglas = [ "dos_palabras" => function() (return new UserNameRule; ) ]; $filtro = (nueva FilterFactory($reglas))->newSubjectFilter();

Ahora nuestra regla de dos_palabras se puede usar como cualquier otra regla de la distribución estándar.

Comentario

Como recordará, los datos de entrada que estamos validando son completamente inválidos, porque cada campo contiene un valor incorrecto o no lo contiene en absoluto. Por lo tanto, se supone que como resultado de la validación, recibiremos errores y los mensajes correspondientes sobre ellos.


Validamos con Aura.Filter de la siguiente manera:


$válido = $filtro->aplicar($datos); if (! $válido) ( $fallos = $filtro->getFailures(); $mensajes = $fallos->getMessages(); )

EN $mensajes se escribe una matriz, por lo que necesitamos dos foreach anidados para mostrar mensajes:


    $errores) ( foreach ($errores as $error) ( printf("", $error); ) ) ?>

Respetar la Validación

La segunda biblioteca que utilicé en comparación es una solución relativamente popular llamada Respect Validation. Dado que la gente confía en ella, creo que hay algo que ver allí.


Para la pureza del experimento, al comparar bibliotecas, usaremos el mismo conjunto de datos definido al principio:


use Respect\Validation\Validator como v; $data = [ "name" => "Albert", // Deberían ser dos palabras "login" => "@lbert", // Carácter "Prohibido" @ "email" => "algo va mal", // Esto debería ser un correo electrónico "contraseña" => "" // Sin contraseña // "aceptado" no está en la matriz porque el usuario no marcó la casilla ];

Definición de las reglas

Al igual que con Aura.Filter, necesitamos nuestra propia regla de validación para el nombre de usuario, así que comencemos con eso:


espacio de nombres Mi espacio de nombres; use Respeto\Validación\Reglas\AbstractRule; class UserNameRule extiende AbstractRule ( función pública validar ($ entrada) ( return (bool) preg_match ("/^+\s+$/u", $ entrada); ) )

La API de reglas externas es casi idéntica a Aura.Filter, solo el método validar() en lugar de magia __invocar(). Me pareció, esta API, más simple y comprensible. Bueno, está más cerca de Kontrolio :)


No encontré ninguna mención de esto en la documentación, sin embargo, además de la regla en sí, es necesario crear su propio tipo de excepción. El nombre de la clase de excepción debe consistir en el nombre de la clase de regla y un sufijo Excepción.


use Respeto\Validación\Excepciones\NestedValidationException; clase UserNameRuleException extiende NestedValidationException ( // )

Finalmente, podemos validar nuestros datos. Primero, pasamos nuestra nueva regla al validador para que la conozca, para que podamos usarla en el futuro. En Respect Validation, esto se hace llamando al método con() con la transferencia del espacio de nombres en el que se encuentran las reglas no estándar.


v::with("Mi espacio de nombres\\");

Ahora todas las reglas no estándar que están en el espacio de nombres mi espacio de nombres, será "identificado" por el validador. El siguiente paso es describir las reglas requeridas y realizar la validación.


v::attribute("nombre", v::userNameRule()) ->attribute("login", v::alnum("-_")) ->attribute("email", v::email()) ->atributo("contraseña", v::notEmpty()->stringType()->longitud(nulo, 64)) ->atributo("de acuerdo", v::trueVal()) ->afirmar((objeto) $datos);

Observe cómo aplicamos nuestra regla al atributo nombre. Aquí el nombre de la clase de regla se ha transformado en el nombre del método de validación. El resto de reglas, en general, son intuitivas.


Por separado, vale la pena mencionar por qué traemos la matriz $datos al objeto El hecho es que Respect Validation toma objetos como entrada, no matrices. Esto debe tenerse en cuenta al desarrollar utilizando esta biblioteca.

Comentario

A diferencia de Aura.Filter, el validador Respect lanza una excepción cuando falla la validación. Y esta excepción contiene mensajes de error de validación. Por lo tanto, el ejemplo que se acaba de mostrar debe escribirse de la siguiente manera:


try ( v::with("RespectValidationExample\\"); v::attribute("name", v::userNameRule()) ->attribute("login", v::alnum("-_")) - >atributo("correo electrónico", v::correo()) ->atributo("contraseña", v::notEmpty()->stringType()->longitud(nulo, 64)) ->atributo("aceptado", v::trueVal()) ->assert((objeto) $datos); ) catch (NestedValidationException $ex) ( $mensajes = $ex->getMessages(); )

Usando obtener mensajes (), obtendremos una matriz plana de todos los mensajes que el validador recopiló durante el proceso de validación. Al volcar una matriz, obtenemos algo como esto:


array(5) ( => string(29) “La validación de datos falló para %s” => string(60) “el inicio de sesión debe contener solo letras (a-z), dígitos (0–9) y “-_”” => cadena (25) “el correo electrónico debe ser un correo electrónico válido” => cadena (26) “la contraseña no debe estar vacía” => cadena (32) “El atributo acordado debe estar presente” )

Puede cambiar los mensajes por los suyos. Quizás de alguna manera no entendí bien esta biblioteca, pero este proceso no me pareció tan obvio: necesitas usar el método buscarMensajes() en una excepción manejada donde define mensajes no para atributos sino para reglas.


$ex->findMessages([ "userNameRule" => "El nombre de usuario debe tener dos palabras.", "alnum" => "No nos gusta su nombre de usuario.", "email" => "Obviamente no quiere danos tu correo electrónico.", "notEmpty" => "¿Dónde está tu contraseña?", "de acuerdo" => "Lo siento, no estás de acuerdo". ]);

No sé cuál es el error, pero hay un par de cosas que todavía no entiendo. Esto es lo que obtenemos al definir las reglas de la forma anterior:


array(5) ( => string(40) "El nombre de usuario debe tener dos palabras". => string(31) "No nos gusta su nombre de usuario". => string(25) "el correo electrónico debe ser un correo electrónico válido" => string(5) "¿Dónde está tu contraseña?" => string(9) "Lo siento, no estás de acuerdo". )

Como puede ver, el mensaje para el campo de correo electrónico no se aplicó, se mantuvo el estándar. ¡Pero el mensaje detrás del índice 4 es lo contrario! Y esto a pesar de que no usé el nombre de la regla, sino el nombre del campo. Mientras que si usé el nombre de la regla (trueVal), mi mensaje se perdería en alguna parte. Comentarios usuarios experimentados esta biblioteca son muy bienvenidos.

Validación de Sirio

Bien, pasemos a la siguiente biblioteca y veamos cómo maneja tareas similares.

Definición de las reglas

Nuevamente, necesitamos definir una regla para el nombre de usuario. Lo escribiremos algo como esto:


class UserNameRule extiende AbstractRule ( // Mensajes de error const MENSAJE = "El nombre de usuario debe tener dos palabras."; const LABELED_MESSAGE = "(etiqueta) debe tener dos palabras". bool) preg_match("/^+\s+$/u", $valor); ) )

Preste atención a la diferencia de enfoques en comparación con las bibliotecas ya consideradas. Definimos dos tipos de mensajes en constantes en lugar de usar propiedades, métodos o argumentos de reglas.


Ahora describamos la lógica de validación:


$validador = nuevo validador; $validator ->add("nombre", "requerido | MyApp\Validation\Rule\UserNameRule") ->add("inicio de sesión", "requerido | alphanumhyphen", null, "El inicio de sesión solo puede contener letras latinas, guiones y guiones bajos. ") ->add("correo electrónico", "obligatorio | correo electrónico", nulo, "Por favor, introduzca un correo electrónico válido.") ->add("contraseña", "obligatorio | maxlength(64)", nulo, "Su contraseña, señor.") ->add("de acuerdo", "obligatorio | igual (verdadero)", null, "¿Por qué no estuvo de acuerdo?");

Como puede ver, el conjunto de reglas es bastante simple y legible. Para las descripciones, usamos nombres separados por guiones horizontales. Este enfoque es similar al utilizado por Laravel y Kontrolio.


Argumento del cuarto método agregar() describe el mensaje de error de validación que utiliza Sirius si falla la validación. ¿Por qué no agregamos un mensaje para nuestra nueva regla? Regla de nombre de usuario?


$validador->add("nombre", "obligatorio | MiAplicación\Validación\Regla\NombreDeUsuarioRegla")

Esto se debe a que los mensajes ya están descritos en las constantes de clase:


class UserNameRule extiende AbstractRule ( // Mensajes de error const MENSAJE = "El nombre de usuario debe tener dos palabras."; ...

Otra opción es utilizar el método addMessage() del propio validador:


$validator->addMessage("correo electrónico", "Por favor, introduzca un correo electrónico válido.");

Tenga en cuenta que las reglas personalizadas se identifican por el nombre completo de su clase, mientras que en Kontrolio puede establecer un alias/alias.

Comentario

Para realizar la validación, llamamos al método validador validar(), pasándole datos:


$data = [ "name" => "Albert", // Deberían ser dos palabras "login" => "@lbert", // Carácter "Prohibido" @ "email" => "algo va mal", // Esto debería ser un correo electrónico "contraseña" => "" // Sin contraseña // "aceptado" no está en la matriz porque el usuario no marcó la casilla ]; $validador->validar($datos);

A diferencia de Respect, Sirius no lanzará una excepción, simplemente regresará FALSO. Los mensajes de error de validación se pueden recibir a través del método de validación. obtener mensajes (). Devuelve errores agrupados por atributo, por lo que necesitamos dos bucles foreach para iterar a través de los errores:


foreach ($validador->getMessages() as $atributo => $mensajes) ( foreach ($mensajes as $mensaje) ( echo $mensaje->getTemplate() . "\n"; ) )

Aquí $message es un objeto de clase Sirius\Validación\Mensaje de error, que tiene un método getTemplate(), que devuelve el mensaje que necesitamos.

valitron

Definición de las reglas

La primera diferencia es que no necesita crear una clase separada para agregar una nueva regla. Simplemente puede usar un cierre que devuelva un resultado booleano.


Hay un método estático para agregar reglas personalizadas a Valitron añadirRegla(), donde los dos primeros argumentos son obligatorios y el tercero es opcional. Me gustó este método, porque aquí el identificador de la regla, la lógica y el mensaje de error se indican en un solo lugar a la vez.


utilice Valitron\Validator; Validator::addRule("two_words", function($field, $value) ( return (bool) preg_match("/^+\s+$/u", $value); ), "El nombre de usuario debe tener exactamente dos palabras .");

La segunda diferencia es cómo se aplican las reglas a los atributos. En todos los casos anteriores hemos visto que un atributo es, por así decirlo, una cosa primaria.


Valitron fue por el otro lado y puso las reglas de validación en primer lugar. Al describir las reglas, aplica atributos a estas reglas, y no al revés.


$validador = nuevo Validador($datos); $validador ->regla("dos_palabras", "nombre")->etiqueta("") ->regla("obligatorio", [ "nombre", "inicio de sesión", "correo electrónico", "contraseña", "aceptado" ] ) ->regla("slug", "login") ->regla("correo electronico", "correo electronico") ->regla("aceptado", "de acuerdo");

Como puede ver en el ejemplo, en el método regla() primero escribimos el nombre de la regla, y solo luego especificamos los atributos que deben coincidir con esta regla. Un ejemplo más explícito es la regla requerida, que muestra cómo los atributos "pertenecen" a la regla.


Valitron (al igual que las otras soluciones que hemos analizado) proporciona mensajes de error estándar. Si solo los usa, verá que cada mensaje comienza con el nombre del atributo correspondiente.


Valitron sustituye los nombres de los atributos en el texto del mensaje incluso cuando se utilizan mensajes de error no estándar. Es por eso que usamos el método label() con una cadena vacía para eliminar el nombre del atributo.


$validador->regla("dos_palabras", "nombre")->etiqueta("")

Comentario

En concreto, en lo que respecta a la validación, la API de la biblioteca de Valitron prácticamente no se diferencia de lo que ya hemos visto en el artículo. Para realizar la validación, llamamos al método validador validar():


$validador->validar();

Los mensajes de error de validación se pueden obtener usando el método getErrors():


$validador->errores();

Los mensajes aquí están agrupados por atributos exactamente de la misma manera que en la Validación de Sirius, excepto que no hay una clase separada para el mensaje y obtenemos una matriz multidimensional regular.


foreach ($validador->errores() as $atributo => $mensajes) ( foreach ($mensajes as $mensaje) ( echo $mensaje . "\n"; ) )

control

Y finalmente, la última biblioteca de hoy es mi propio desarrollo llamado Kontrolio.

Definición de las reglas

Nuevamente, por quinta vez, crearemos una regla de validación para el nombre de usuario. Todo es relativamente simple y estándar:


espacio de nombres MiProyecto\Validación\Reglas; use Kontrolio\Rules\AbstractRule; clase TwoWords extiende Kontrolio\Rules\AbstractRule ( función pública isValid($input = null) ( return (bool) preg_match("/^+\s+$/u", $input); ) )

Ahora creamos una fábrica y registramos la regla en ella usando el método extender():


espacio de nombres MiProyecto; usar Control\Fábrica; use MiProyecto\Validación\Reglas\DosPalabras; $factory = Kontrolio\Factory::getInstance()->extend();

Después de registrar la regla, podemos usarla, incluso por nombre: dos_palabras. Vamos a crear un validador:


$datos = [ "nombre" => "Albert", // Deberían ser dos palabras "iniciar sesión" => "@lbert", // Carácter "Prohibido" @ "email" => "algo está mal", // Esto debería ser un correo electrónico "contraseña" => "" // Sin contraseña // "aceptado" no está en la matriz porque el usuario no marcó la casilla ]; $reglas = [ "nombre" => "dos_palabras", "iniciar sesión" => "a veces|guión alfabético", "correo electrónico" => "correo electrónico", "contraseña" => "longitud:1,64", "de acuerdo" = > "aceptado"]; $messages = [ "name" => "Tu nombre de usuario debe tener dos palabras.", "login" => "No nos gusta tu nombre de usuario.", "email" => "Obviamente no quieres darnos su dirección de correo electrónico .", "contraseña" => "Entonces, ¿dónde está su contraseña?", "de acuerdo" => "Lo siento, no está de acuerdo". ]; $validador = $factory->make($datos, $reglas, $mensajes);

Hemos descrito las reglas utilizando una sintaxis similar a la utilizada en Laravel, aunque podríamos haber utilizado una versión más detallada:


$reglas = [ "nombre" => new TwoWords, "login" => , "email" => new Email, "password" => new Length(1, 64), "agreed" => new Accepted ];

Comentario

La validación se inicia con el mismo método. validar():


$validador->validar();

Ahora podemos obtener mensajes de error usando uno de los métodos getErrors() o getErrorsList(). El primer método permite una salida de error más compleja, mientras que el segundo devuelve una matriz plana. Usando getErrors() podemos mostrar mensajes como este:


    $mensajes): ?>

un con getErrorsList() puedes hacer una lista más simple de mensajes:


obtenerListaErrores(); ?>

Resultado

En este artículo, mostré ejemplos del uso de las siguientes bibliotecas:

  1. Aura.Filtro
  2. Respetar la Validación
  3. Validación de Sirio
  4. valitron
  5. control

El "ejemplo del mundo real" puede parecer demasiado simple. Tengo que estar de acuerdo, ya que, de hecho, algunas de las características de las bibliotecas quedaron fuera del artículo. En principio, si está interesado, puede estudiar sus características usted mismo.


Cada una de las bibliotecas ofrece sus propios chips, tiene sus propios lados oscuros, por lo que creo que es una cuestión de gusto y tarea: elegir el correcto.


Gracias por leer. Tomar la decisión correcta.

Etiquetas:

  • validación de datos
  • php
  • ciclismo
Agregar etiquetas

En el artículo anterior, prometí escribir una comparación de mi propia biblioteca con otras soluciones disponibles, así que hoy veremos la validación usando Aura.Filter, Respect Validation, Sirius Validation y Valitron.


Imaginemos que tenemos algún tipo de servicio público en desarrollo, que implica el registro de usuarios para el acceso completo a todas las funciones. Así, el formulario de registro contendrá los siguientes campos:

  1. nombre. Debe contener exactamente dos palabras, donde la primera es el nombre del usuario y la segunda es el apellido.
  2. acceso. Si se pasa un valor, debe contener solo letras latinas, guiones y guiones bajos.
  3. correo electrónico. Debe contener una dirección de correo electrónico válida.
  4. contraseña. Debe estar instalado y no más de 64 caracteres.
  5. acordado. Una casilla de verificación típica que el usuario debe marcar para confirmar su acuerdo con los términos del servicio.

Entonces, tenemos cinco campos que el usuario debe completar para registrarse en nuestro servicio imaginario. Imaginemos que recibimos datos completamente inválidos como entrada:


$data = [ "name" => "Albert", // Deberían ser dos palabras "login" => "@lbert", // Carácter "Prohibido" @ "email" => "algo va mal", // Esto debería ser correo electrónico "contraseña" =>

Aura.Filtro

La validación con Aura.Filter comienza con una fábrica de filtros. Necesitamos crear un llamado "filtro de sujeto", ya que validaremos una matriz, no un valor individual.

Definición de las reglas

use Aura\Filter\FilterFactory; $filtro = (nueva FilterFactory)->newSubjectFilter(); $filter->validate("nombre") ->isNotBlank() ->is("two_words") ->setMessage("El nombre debe tener dos palabras"); $filter->validate("iniciar sesión") ->isBlankOr("alnum") ->setMessage("Si especifica un inicio de sesión, debe contener solo caracteres latinos"); $filter->validate("correo electrónico") ->isNotBlank() ->is("correo electrónico") ->setMessage("Ingrese una dirección de correo electrónico válida"); $filter->validate("contraseña") ->isNotBlank() ->is("strlenMax", 64) ->setMessage("Ingrese una contraseña"); $filtro->validate("aceptado") ->is("devolución de llamada", function($asunto, $campo) ( return $asunto->($campo) === verdadero; ))->setMessage("Necesitas estoy de acuerdo con los términos del servicio.");

Como puede ver, la descripción de las reglas es bastante simple. Aura.Filter proporciona un conjunto completo de reglas útiles listas para usar, y algunas de ellas se usaron en el ejemplo anterior:

  1. método no está en blanco. Especifica que el campo no puede ser nulo.
  2. alnum. Esta regla solo permite letras latinas.
  3. correo electrónico. Y tan claro :)
  4. strlenMax. Especifica que el campo no puede exceder la longitud especificada por el segundo argumento del método is.
  5. llamar de vuelta. Este tipo de regla es similar a los cierres de Kontrolio. Te permite definir una regla como un cierre. En este cierre, Aura.Filter pasa "asunto", nuestra matriz de datos del formulario, y un campo, en este caso acordado.

Es posible que haya notado que no especifiqué la regla de dos_palabras. Naturalmente, no existe tal regla en Aura.Filter, por lo que debemos crearla. Como dice la documentación, esto se hace con una clase separada para la regla:


/** * La regla que valida el nombre de usuario. * El nombre de usuario consta de dos palabras: nombre y apellido, separados por un espacio. */ class UserNameRule ( /** * Valida el nombre de usuario. * * @param object|array $subject * @param string $field * @param int $max * * @return bool */ public function __invoke($subject, $field , $max = null) ( $value = $subject->($field); if (! is_scalar($value)) ( return false; ) return (bool) preg_match("/^+\s+$/u", $valor); ) )

El segundo paso es informar a la fábrica de filtros sobre nuestra nueva regla. Se hace pasando el primer argumento como una matriz de reglas a la fábrica de filtros:


El siguiente paso es avisar a Aura.Filter que hemos creado una nueva regla y queremos usarla. Esto se hace pasando una serie de reglas al primer argumento de fábrica:


use Aura\Filter\FilterFactory; $reglas = [ "dos_palabras" => function() (return new UserNameRule; ) ]; $filtro = (nueva FilterFactory($reglas))->newSubjectFilter();

Ahora nuestra regla de dos_palabras se puede usar como cualquier otra regla de la distribución estándar.

Comentario

Como recordará, los datos de entrada que estamos validando son completamente inválidos, porque cada campo contiene un valor incorrecto o no lo contiene en absoluto. Por lo tanto, se supone que como resultado de la validación, recibiremos errores y los mensajes correspondientes sobre ellos.


Validamos con Aura.Filter de la siguiente manera:


$válido = $filtro->aplicar($datos); if (! $válido) ( $fallos = $filtro->getFailures(); $mensajes = $fallos->getMessages(); )

EN $mensajes se escribe una matriz, por lo que necesitamos dos foreach anidados para mostrar mensajes:


    $errores) ( foreach ($errores as $error) ( printf("", $error); ) ) ?>

Respetar la Validación

La segunda biblioteca que utilicé en comparación es una solución relativamente popular llamada Respect Validation. Dado que la gente confía en ella, creo que hay algo que ver allí.


Para la pureza del experimento, al comparar bibliotecas, usaremos el mismo conjunto de datos definido al principio:


use Respect\Validation\Validator como v; $data = [ "name" => "Albert", // Deberían ser dos palabras "login" => "@lbert", // Carácter "Prohibido" @ "email" => "algo va mal", // Esto debería ser un correo electrónico "contraseña" => "" // Sin contraseña // "aceptado" no está en la matriz porque el usuario no marcó la casilla ];

Definición de las reglas

Al igual que con Aura.Filter, necesitamos nuestra propia regla de validación para el nombre de usuario, así que comencemos con eso:


espacio de nombres Mi espacio de nombres; use Respeto\Validación\Reglas\AbstractRule; class UserNameRule extiende AbstractRule ( función pública validar ($ entrada) ( return (bool) preg_match ("/^+\s+$/u", $ entrada); ) )

La API de reglas externas es casi idéntica a Aura.Filter, solo el método validar() en lugar de magia __invocar(). Me pareció, esta API, más simple y comprensible. Bueno, está más cerca de Kontrolio :)


No encontré ninguna mención de esto en la documentación, sin embargo, además de la regla en sí, es necesario crear su propio tipo de excepción. El nombre de la clase de excepción debe consistir en el nombre de la clase de regla y un sufijo Excepción.


use Respeto\Validación\Excepciones\NestedValidationException; clase UserNameRuleException extiende NestedValidationException ( // )

Finalmente, podemos validar nuestros datos. Primero, pasamos nuestra nueva regla al validador para que la conozca, para que podamos usarla en el futuro. En Respect Validation, esto se hace llamando al método con() con la transferencia del espacio de nombres en el que se encuentran las reglas no estándar.


v::with("Mi espacio de nombres\\");

Ahora todas las reglas no estándar que están en el espacio de nombres mi espacio de nombres, será "identificado" por el validador. El siguiente paso es describir las reglas requeridas y realizar la validación.


v::attribute("nombre", v::userNameRule()) ->attribute("login", v::alnum("-_")) ->attribute("email", v::email()) ->atributo("contraseña", v::notEmpty()->stringType()->longitud(nulo, 64)) ->atributo("de acuerdo", v::trueVal()) ->afirmar((objeto) $datos);

Observe cómo aplicamos nuestra regla al atributo nombre. Aquí el nombre de la clase de regla se ha transformado en el nombre del método de validación. El resto de reglas, en general, son intuitivas.


Por separado, vale la pena mencionar por qué traemos la matriz $datos al objeto El hecho es que Respect Validation toma objetos como entrada, no matrices. Esto debe tenerse en cuenta al desarrollar utilizando esta biblioteca.

Comentario

A diferencia de Aura.Filter, el validador Respect lanza una excepción cuando falla la validación. Y esta excepción contiene mensajes de error de validación. Por lo tanto, el ejemplo que se acaba de mostrar debe escribirse de la siguiente manera:


try ( v::with("RespectValidationExample\\"); v::attribute("name", v::userNameRule()) ->attribute("login", v::alnum("-_")) - >atributo("correo electrónico", v::correo()) ->atributo("contraseña", v::notEmpty()->stringType()->longitud(nulo, 64)) ->atributo("aceptado", v::trueVal()) ->assert((objeto) $datos); ) catch (NestedValidationException $ex) ( $mensajes = $ex->getMessages(); )

Usando obtener mensajes (), obtendremos una matriz plana de todos los mensajes que el validador recopiló durante el proceso de validación. Al volcar una matriz, obtenemos algo como esto:


array(5) ( => string(29) “La validación de datos falló para %s” => string(60) “el inicio de sesión debe contener solo letras (a-z), dígitos (0–9) y “-_”” => cadena (25) “el correo electrónico debe ser un correo electrónico válido” => cadena (26) “la contraseña no debe estar vacía” => cadena (32) “El atributo acordado debe estar presente” )

Puede cambiar los mensajes por los suyos. Quizás de alguna manera no entendí bien esta biblioteca, pero este proceso no me pareció tan obvio: necesitas usar el método buscarMensajes() en una excepción manejada donde define mensajes no para atributos sino para reglas.


$ex->findMessages([ "userNameRule" => "El nombre de usuario debe tener dos palabras.", "alnum" => "No nos gusta su nombre de usuario.", "email" => "Obviamente no quiere danos tu correo electrónico.", "notEmpty" => "¿Dónde está tu contraseña?", "de acuerdo" => "Lo siento, no estás de acuerdo". ]);

No sé cuál es el error, pero hay un par de cosas que todavía no entiendo. Esto es lo que obtenemos al definir las reglas de la forma anterior:


array(5) ( => string(40) "El nombre de usuario debe tener dos palabras". => string(31) "No nos gusta su nombre de usuario". => string(25) "el correo electrónico debe ser un correo electrónico válido" => string(5) "¿Dónde está tu contraseña?" => string(9) "Lo siento, no estás de acuerdo". )

Como puede ver, el mensaje para el campo de correo electrónico no se aplicó, se mantuvo el estándar. ¡Pero el mensaje detrás del índice 4 es lo contrario! Y esto a pesar de que no usé el nombre de la regla, sino el nombre del campo. Mientras que si usé el nombre de la regla (trueVal), mi mensaje se perdería en alguna parte. Los comentarios de los usuarios experimentados de esta biblioteca son muy bienvenidos.

Validación de Sirio

Bien, pasemos a la siguiente biblioteca y veamos cómo maneja tareas similares.

Definición de las reglas

Nuevamente, necesitamos definir una regla para el nombre de usuario. Lo escribiremos algo como esto:


class UserNameRule extiende AbstractRule ( // Mensajes de error const MENSAJE = "El nombre de usuario debe tener dos palabras."; const LABELED_MESSAGE = "(etiqueta) debe tener dos palabras". bool) preg_match("/^+\s+$/u", $valor); ) )

Preste atención a la diferencia de enfoques en comparación con las bibliotecas ya consideradas. Definimos dos tipos de mensajes en constantes en lugar de usar propiedades, métodos o argumentos de reglas.


Ahora describamos la lógica de validación:


$validador = nuevo validador; $validator ->add("nombre", "requerido | MyApp\Validation\Rule\UserNameRule") ->add("inicio de sesión", "requerido | alphanumhyphen", null, "El inicio de sesión solo puede contener letras latinas, guiones y guiones bajos. ") ->add("correo electrónico", "obligatorio | correo electrónico", nulo, "Por favor, introduzca un correo electrónico válido.") ->add("contraseña", "obligatorio | maxlength(64)", nulo, "Su contraseña, señor.") ->add("de acuerdo", "obligatorio | igual (verdadero)", null, "¿Por qué no estuvo de acuerdo?");

Como puede ver, el conjunto de reglas es bastante simple y legible. Para las descripciones, usamos nombres separados por guiones horizontales. Este enfoque es similar al utilizado por Laravel y Kontrolio.


Argumento del cuarto método agregar() describe el mensaje de error de validación que utiliza Sirius si falla la validación. ¿Por qué no agregamos un mensaje para nuestra nueva regla? Regla de nombre de usuario?


$validador->add("nombre", "obligatorio | MiAplicación\Validación\Regla\NombreDeUsuarioRegla")

Esto se debe a que los mensajes ya están descritos en las constantes de clase:


class UserNameRule extiende AbstractRule ( // Mensajes de error const MENSAJE = "El nombre de usuario debe tener dos palabras."; ...

Otra opción es utilizar el método addMessage() del propio validador:


$validator->addMessage("correo electrónico", "Por favor, introduzca un correo electrónico válido.");

Tenga en cuenta que las reglas personalizadas se identifican por el nombre completo de su clase, mientras que en Kontrolio puede establecer un alias/alias.

Comentario

Para realizar la validación, llamamos al método validador validar(), pasándole datos:


$data = [ "name" => "Albert", // Deberían ser dos palabras "login" => "@lbert", // Carácter "Prohibido" @ "email" => "algo va mal", // Esto debería ser un correo electrónico "contraseña" => "" // Sin contraseña // "aceptado" no está en la matriz porque el usuario no marcó la casilla ]; $validador->validar($datos);

A diferencia de Respect, Sirius no lanzará una excepción, simplemente regresará FALSO. Los mensajes de error de validación se pueden recibir a través del método de validación. obtener mensajes (). Devuelve errores agrupados por atributo, por lo que necesitamos dos bucles foreach para iterar a través de los errores:


foreach ($validador->getMessages() as $atributo => $mensajes) ( foreach ($mensajes as $mensaje) ( echo $mensaje->getTemplate() . "\n"; ) )

Aquí $message es un objeto de clase Sirius\Validación\Mensaje de error, que tiene un método getTemplate(), que devuelve el mensaje que necesitamos.

valitron

Definición de las reglas

La primera diferencia es que no necesita crear una clase separada para agregar una nueva regla. Simplemente puede usar un cierre que devuelva un resultado booleano.


Hay un método estático para agregar reglas personalizadas a Valitron añadirRegla(), donde los dos primeros argumentos son obligatorios y el tercero es opcional. Me gustó este método, porque aquí el identificador de la regla, la lógica y el mensaje de error se indican en un solo lugar a la vez.


utilice Valitron\Validator; Validator::addRule("two_words", function($field, $value) ( return (bool) preg_match("/^+\s+$/u", $value); ), "El nombre de usuario debe tener exactamente dos palabras .");

La segunda diferencia es cómo se aplican las reglas a los atributos. En todos los casos anteriores hemos visto que un atributo es, por así decirlo, una cosa primaria.


Valitron fue por el otro lado y puso las reglas de validación en primer lugar. Al describir las reglas, aplica atributos a estas reglas, y no al revés.


$validador = nuevo Validador($datos); $validador ->regla("dos_palabras", "nombre")->etiqueta("") ->regla("obligatorio", [ "nombre", "inicio de sesión", "correo electrónico", "contraseña", "aceptado" ] ) ->regla("slug", "login") ->regla("correo electronico", "correo electronico") ->regla("aceptado", "de acuerdo");

Como puede ver en el ejemplo, en el método regla() primero escribimos el nombre de la regla, y solo luego especificamos los atributos que deben coincidir con esta regla. Un ejemplo más explícito es la regla requerida, que muestra cómo los atributos "pertenecen" a la regla.


Valitron (al igual que las otras soluciones que hemos analizado) proporciona mensajes de error estándar. Si solo los usa, verá que cada mensaje comienza con el nombre del atributo correspondiente.


Valitron sustituye los nombres de los atributos en el texto del mensaje incluso cuando se utilizan mensajes de error no estándar. Es por eso que usamos el método label() con una cadena vacía para eliminar el nombre del atributo.


$validador->regla("dos_palabras", "nombre")->etiqueta("")

Comentario

En concreto, en lo que respecta a la validación, la API de la biblioteca de Valitron prácticamente no se diferencia de lo que ya hemos visto en el artículo. Para realizar la validación, llamamos al método validador validar():


$validador->validar();

Los mensajes de error de validación se pueden obtener usando el método getErrors():


$validador->errores();

Los mensajes aquí están agrupados por atributos exactamente de la misma manera que en la Validación de Sirius, excepto que no hay una clase separada para el mensaje y obtenemos una matriz multidimensional regular.


foreach ($validador->errores() as $atributo => $mensajes) ( foreach ($mensajes as $mensaje) ( echo $mensaje . "\n"; ) )

control

Y finalmente, la última biblioteca de hoy es mi propio desarrollo llamado Kontrolio.

Definición de las reglas

Nuevamente, por quinta vez, crearemos una regla de validación para el nombre de usuario. Todo es relativamente simple y estándar:


espacio de nombres MiProyecto\Validación\Reglas; use Kontrolio\Rules\AbstractRule; clase TwoWords extiende Kontrolio\Rules\AbstractRule ( función pública isValid($input = null) ( return (bool) preg_match("/^+\s+$/u", $input); ) )

Ahora creamos una fábrica y registramos la regla en ella usando el método extender():


espacio de nombres MiProyecto; usar Control\Fábrica; use MiProyecto\Validación\Reglas\DosPalabras; $factory = Kontrolio\Factory::getInstance()->extend();

Después de registrar la regla, podemos usarla, incluso por nombre: dos_palabras. Vamos a crear un validador:


$datos = [ "nombre" => "Albert", // Deberían ser dos palabras "iniciar sesión" => "@lbert", // Carácter "Prohibido" @ "email" => "algo está mal", // Esto debería ser un correo electrónico "contraseña" => "" // Sin contraseña // "aceptado" no está en la matriz porque el usuario no marcó la casilla ]; $reglas = [ "nombre" => "dos_palabras", "iniciar sesión" => "a veces|guión alfabético", "correo electrónico" => "correo electrónico", "contraseña" => "longitud:1,64", "de acuerdo" = > "aceptado"]; $messages = [ "name" => "Tu nombre de usuario debe tener dos palabras.", "login" => "No nos gusta tu nombre de usuario.", "email" => "Obviamente no quieres darnos su dirección de correo electrónico .", "contraseña" => "Entonces, ¿dónde está su contraseña?", "de acuerdo" => "Lo siento, no está de acuerdo". ]; $validador = $factory->make($datos, $reglas, $mensajes);

Hemos descrito las reglas utilizando una sintaxis similar a la utilizada en Laravel, aunque podríamos haber utilizado una versión más detallada:


$reglas = [ "nombre" => new TwoWords, "login" => , "email" => new Email, "password" => new Length(1, 64), "agreed" => new Accepted ];

Comentario

La validación se inicia con el mismo método. validar():


$validador->validar();

Ahora podemos obtener mensajes de error usando uno de los métodos getErrors() o getErrorsList(). El primer método permite una salida de error más compleja, mientras que el segundo devuelve una matriz plana. Usando getErrors() podemos mostrar mensajes como este:


    $mensajes): ?>

un con getErrorsList() puedes hacer una lista más simple de mensajes:


obtenerListaErrores(); ?>

Resultado

En este artículo, mostré ejemplos del uso de las siguientes bibliotecas:

  1. Aura.Filtro
  2. Respetar la Validación
  3. Validación de Sirio
  4. valitron
  5. control

El "ejemplo del mundo real" puede parecer demasiado simple. Tengo que estar de acuerdo, ya que, de hecho, algunas de las características de las bibliotecas quedaron fuera del artículo. En principio, si está interesado, puede estudiar sus características usted mismo.


Cada una de las bibliotecas ofrece sus propios chips, tiene sus propios lados oscuros, por lo que creo que es una cuestión de gusto y tarea: elegir el correcto.


Gracias por leer. Tomar la decisión correcta.

Etiquetas: Agregar etiquetas

Laravel viene con un simple, sistema conveniente validación (comprobación de los datos de entrada para el cumplimiento de las reglas) y recepción de mensajes de error, por parte de la clase Validación.

El ejemplo más simple de validación.

$validador = Validador::make(array("nombre" => "Dale"), array("nombre" => "requerido|min:5"));

El primer parámetro pasado al método make son los datos a verificar. El segundo parámetro son las reglas que se les deben aplicar.

Uso de matrices para especificar reglas

Las reglas múltiples pueden estar separadas por una barra de avance (|) o por elementos separados formación.

$validator = Validator::make(array("name" => "Dale"), array("name" => array("requerido", "min:5")));

Validando varios campos

$validador = Validador::make(array("nombre" => "Dale", "contraseña" => "contraseña incorrecta", "email" => " [correo electrónico protegido]"), array("nombre" => "obligatorio", "contraseña" => "obligatorio|min:8", "email" => "obligatorio|email|único"));

Una vez que se ha creado una instancia de Validator, se puede usar el método de falla (o aprobación) para realizar la validación.

If ($validator->fails()) ( // Los datos pasados ​​fallaron en la validación)

Si el validador ha encontrado errores, puede obtener sus mensajes como este:

$mensajes = $validador->mensajes();

También puede obtener una serie de reglas que fallaron en la validación sin los mensajes en sí:

$fallido = $validador->fallido();

Comprobación de archivos

La clase Validator contiene varias reglas iniciales para validar archivos, como size , mimes y otras. Para realizar la validación de archivos, simplemente transfiera esos archivos junto con otros datos.

Gancho después de la validación

Laravel, una vez completada la validación, puede ejecutar su función de cierre, en la que puede, por ejemplo, verificar algo especial o agregar algún tipo de mensaje de error propio. Esto se hace usando el método after():

$validador = Validador::make(...); $validador->después(función($validador) ( if ($this->somethingElseIsInvalid()) ( $validator->errors()->add("field", "¡Algo está mal con este campo!"); ) )); si ($validador->falla()) ( // )

Puede agregar múltiples después de s si es necesario.

Validación en controladores

Escribir un código de validación completo cada vez que necesita validar datos es un inconveniente. Por lo tanto, Laravel proporciona varias soluciones para simplificar este procedimiento.

El controlador base App\Http\Controllers\Controller incluye el rasgo ValidatesRequests, que ya contiene métodos de validación:

/** * Guarda la publicación del blog. * * @param Request $request * @return Response */ public function store(Request $request) ( $this->validate($request, [ "title" => "requerido|único|max:255", "body" => "requerido", ]); // )

Si pasa la validación, el código continúa ejecutándose. De lo contrario, se lanza una Illuminate\Contracts\Validation\ValidationException. Si no detecta esta excepción, el marco la detectará, llenará las variables flash con mensajes de error de validación y dirigirá al usuario a la página anterior con el formulario, ¡él mismo!

En el caso de una solicitud AJAX, no hay redireccionamiento, el marco devuelve una respuesta con el código HTTP 422 y JSON con errores de validación.

El código anterior es similar a este:

/** * Guarda la publicación del blog. * * @param Request $request * @return Response */ public function store(Request $request) ( $v = Validator::make($request->all(), [ "title" => "requerido|único|max :255", "cuerpo" => "requerido", ]); if ($v->falla()) (return redirect()->back()->withErrors($v->errors()); ) // )

Cambios de formato de error

Si desea personalizar los mensajes de error de validación que se almacenan en las variables flash de sesión en los redireccionamientos, anule el método formatValidationErrors en su controlador:

/** * (@inheritdoc) */ función protegida formatValidationErrors(\Illuminate\Validation\Validator $validator) (return $validator->errors()->all(); )

Solicitar Validación

Para escenarios de validación más complejos, las llamadas Solicitudes de formulario pueden ser convenientes para usted. Estas son clases de solicitud HTTP especiales que contienen la lógica de validación. Procesan la solicitud antes de que llegue al controlador.

Para crear una clase de solicitud, use el comando artesanal make:request:

php artesanal hacer: solicitud StoreBlogPostRequest

La clase se creará en la carpeta app/Http/Requests. Agregue las reglas de validación necesarias a su método de reglas:

/** * Obtener las reglas de validación que se aplican a la solicitud. * * @return array */ reglas de funciones públicas() ( return [ "título" => "requerido|único|máx:255", "cuerpo" => "requerido", ]; )

Para que el marco intercepte la solicitud antes que el controlador, agregue esta clase a los argumentos del método del controlador requerido:

¡Con el uso adecuado de la validación de solicitudes, puede estar seguro de que solo las entradas validadas estarán siempre en sus controladores!

Si la validación falla, el marco llena las variables flash con errores de validación y devuelve una redirección a la página anterior. En el caso de una solicitud AJAX, se devuelve una respuesta con un código 422 y JSON con errores de validación.

Control de acceso

Las clases de solicitud de formulario también contienen un método de autorización. En este método, puede verificar si el usuario puede realizar esta acción, actualizar el recurso dado. Por ejemplo, si un usuario intenta editar un comentario en una publicación, ¿es él el autor de la publicación?

/** * Determinar si el usuario está autorizado para realizar esta solicitud. * * @return bool */ public function authorize() ( $commentId = $this->route("comentario"); return Comentario::where("id", $commentId) ->where("user_id", Auth: :id())->existe(); )

Observe la llamada al método route() anterior. Este método te da acceso a los parámetros en la url (en este caso (comentario)) definidos en la ruta:

Ruta::post("comentario/(comentario)");

Si el método de autorización devuelve falso, el marco genera una respuesta HTTP 403 y la envía de inmediato. El método del controlador no se ejecuta.

/** * Determinar si el usuario está autorizado para realizar esta solicitud. * * @return bool */ función pública autorizar() (retornar verdadero;)

Cambios de formato de error en las variables Flash

Si desea personalizar los mensajes de error de validación que se almacenan en las variables flash de la sesión en los redireccionamientos, anule el método formatValidationErrors en la clase base de la solicitud (App\Http\Requests\Request):

/** * (@inheritdoc) */ función protegida formatValidationErrors(\Illuminate\Validation\Validator $validator) (return $validator->errors()->all(); )

Trabajar con mensajes de error

Después de llamar al método de mensajes del objeto Validator, obtendrá un objeto MessageBag, que tiene un conjunto de métodos útiles para acceder a los mensajes de error.

Obtener el primer mensaje para un campo

echo $mensajes->primero("correo");

Obtener todos los mensajes para un campo

foreach ($mensajes->get("correo electrónico") as $mensaje) ( // )

Obtener todos los mensajes para todos los campos

foreach ($mensajes->todos() como $mensaje) ( // )

Comprobación de un mensaje para un campo

if ($mensajes->has("correo electrónico")) ( // )

Obtener un error en un formato dado

echo $mensajes->primero("correo electrónico", "");

Nota: De forma predeterminada, las publicaciones tienen un formato adecuado para Twitter Bootstrap.

Obtener todos los mensajes en un formato dado

foreach($mensajes->todos("
  • :mensaje
  • ") como $mensaje) ( // )

    Errores y patrones

    Una vez que haya realizado la validación, necesitará una manera fácil de pasar errores a la plantilla. Laravel te permite hacer esto convenientemente. Por ejemplo, tenemos estas rutas:

    Route::get("registrar", function() (return View::make("user.register"); )); Route::post("registrar", función() ( $reglas = array(...); $validador = Validator::make(Input::all(), $reglas); if ($validador->falla( )) (return redirect("registrar")->withErrors($validator); ) ));

    Tenga en cuenta que cuando fallan las comprobaciones, pasamos el objeto Validator al objeto Redirect con el método withErrors. Este método almacenará los mensajes de error en variables de sesión flash únicas, lo que los hará disponibles para la siguiente solicitud.

    Sin embargo, tenga en cuenta que no pasamos View::make("user.register"); variables de $errores a la plantilla. El propio Laravel verifica la presencia de variables en los datos de la sesión y los pasa automáticamente a la plantilla si están disponibles. Por lo tanto, es importante recordar que la variable $errors estará disponible para todas sus plantillas en todo momento, en cualquier solicitud. . Esto le permite asumir que la variable $errors siempre está definida y se puede usar de manera segura. La variable $errors es una instancia de la clase MessageBag.

    Por lo tanto, después de la redirección, puede usar la variable $errors configurada automáticamente en la plantilla:

    primero ("correo electrónico"); ?>

    Bolsa de mensajes con nombre

    Si tiene varios formularios en la página, puede elegir el nombre del objeto MessageBag en el que se devolverán los textos de error para que pueda mostrarlos correctamente para el formulario deseado.

    Return redirigir("registrarse")->withErrors($validator, "login");

    Obtenga el texto de error de MessageBag con el nombre de inicio de sesión:

    iniciar sesión->primero("correo electrónico"); ?>

    Reglas de validación

    A continuación se muestra una lista de todas las reglas disponibles y sus funciones:

    aceptado

    El campo debe estar en valor , en o 1 . Esto es útil para verificar la aceptación de reglas y licencias.

    active_url

    El campo debe ser una URL válida accesible a través de la función checkdnsrr.

    después: fecha

    El campo debe ser una fecha posterior a fecha

    alfa

    El campo debe contener solo caracteres alfabéticos.

    guión_alfa

    El campo debe contener solo caracteres alfabéticos, números, guiones bajos (_) y guiones (-).

    núm_alfa

    El campo debe contener solo caracteres alfabéticos y números.

    formación

    El campo debe ser una matriz.

    antes: fecha

    El campo debe ser una fecha anterior a fecha. Las cadenas se convierten en fechas con la función strtotime.

    entre: min,máximo

    El campo debe estar en el rango de min antes máximo. Las cadenas, los números y los archivos se tratan de manera similar a la regla de tamaño.

    booleano

    El campo debe ser lógico (booleano). Los valores permitidos son verdadero, falso, 1, 0, "1" y "0".

    confirmado

    El valor del campo debe coincidir con el valor del campo con ese nombre, más foo_confirmation . Por ejemplo, si se está comprobando el campo de contraseña, se debe pasar como entrada el campo de confirmación de contraseña coincidente.

    fecha

    El campo debe ser una fecha válida según la función strtotime.

    formato de fecha: formato

    El campo debe coincidir con el formato de fecha formato según la función date_parse_from_format.

    diferente: campo

    El valor del campo bajo validación debe ser diferente del valor del campo campo.

    correo electrónico

    El campo debe ser una dirección de correo electrónico válida.

    existe: mesa,columna

    El campo debe existir en la tabla de base de datos especificada.

    Uso sencillo:

    "estado" => "existe:estados"

    Especificando un nombre de campo en una tabla:

    "estado" => "existe:estados,abreviatura"

    También puede especificar más condiciones para agregar a la consulta "DÓNDE":

    "correo electrónico" => "existe: personal, correo electrónico, id_cuenta, 1"

    imagen

    El archivo subido debe ser una imagen en formato jpeg, png, bmp, gif o svg.

    en: Foo,bar,...

    El valor del campo debe ser uno de los enumerados ( Foo, bar etc.).

    entero

    El campo debe tener un valor entero válido.

    ip

    El campo debe ser una dirección IP válida.

    máximo: valor

    El valor del campo debe ser menor o igual que valor

    mimos: Foo,bar,...

    El tipo MIME del archivo cargado debe ser uno de los enumerados.

    Uso sencillo:

    "foto" => "mimos:jpeg,bmp,png"

    min: valor

    El valor del campo debe ser mayor que valor. Las líneas, los números y los archivos se tratan de manera similar al archivo .

    no en: Foo,bar,...

    Valor de campo No debe ser uno de los enumerados Foo, bar etc.).

    numérico

    El campo debe tener un valor numérico o fraccionario válido.

    expresión regular: patrón

    El campo debe coincidir con la expresión regular especificada.

    Atención: al usar esta regla, puede ser necesario enumerar otras reglas como elementos de matriz, especialmente si la expresión contiene el carácter de barra vertical (|).

    requerido

    El campo bajo validación debe estar presente y tener un valor que no esté vacío.

    requerido_si: campo,valor,...

    El campo bajo validación debe estar presente y tener un valor no vacío si otro campo campo está presente y tiene cualquiera de los valores valor.

    requerido_con: Foo,bar,...

    Al menos uno de los campos enumerados está presente y tiene un valor no vacío ( Foo, bar etc.).

    requerido_con_todos: Foo,bar,...

    El campo bajo prueba debe estar presente y tener un valor no vacío, pero solo si todos los campos enumerados están presentes y tienen un valor no vacío ( Foo, bar etc.).

    requerido_sin: Foo,bar,...

    El campo bajo validación debe estar presente y tener un valor no vacío, pero solo si No al menos uno de los campos enumerados está presente o vacío ( Foo, bar etc.).

    requerido_sin_todo: Foo,bar,...

    El campo bajo validación debe estar presente y tener un valor no vacío, pero solo si No todos los campos enumerados están presentes o vacíos ( Foo, bar etc.).

    mismo: campo

    El campo debe tener el mismo valor que el campo campo.

    tamaño: valor

    El campo debe coincidir valor tamaño. para cuerdas significa longitud, para numeros- número, para archivos- tamaño en kilobytes.

    zona horaria

    El campo debe contener un identificador de zona horaria (timezone), uno de los enumerados en la función php timezone_identifiers_list

    único: mesa,columna,excepto,idColumna

    El valor del campo debe ser único en la tabla de base de datos dada. Si no se especifica la columna, se utilizará el nombre del campo.

    Fácil uso

    "correo electrónico" => "único:usuarios"

    Especificar un nombre de campo en una tabla

    "email" => "único:usuarios,dirección_email"

    Ignorar una identificación específica

    "correo electrónico" => "único:usuarios,dirección_de_correoelectrónico,10"

    Adición de condiciones adicionales

    También puede especificar más condiciones para agregar a la consulta "DÓNDE":

    "correo electrónico" => "único:usuarios,dirección_email,NULL,id,id_cuenta,1"

    En la regla anterior, solo se incluirán en el cheque las filas con un account_id de 1.

    URL

    El campo debe ser una URL válida.

    Nota: Se utiliza la función PHP filter_var

    Reglas condicionales

    A veces es necesario validar un campo solo cuando está presente en la entrada. Para hacer esto, agregue la regla a veces:

    $v = Validator::make($data, array("email" => "a veces|obligatorio|email",));

    En el ejemplo anterior, el campo de correo electrónico solo ejecutará la validación cuando exista $data["email"].

    Reglas condicionales complejas

    A veces, solo desea que un campo tenga un valor si otro campo tiene un valor mayor que, digamos, 100. O puede requerir dos campos solo cuando también se especifica un tercero. Esto se logra fácilmente mediante reglas condicionales. Primero, crea un objeto Validador con un conjunto de reglas estáticas que nunca cambian:

    $v = Validator::make($data, array("email" => "obligatorio|email", "juegos" => "obligatorio|numérico",));

    Ahora supongamos que su aplicación está escrita para coleccionistas de juegos. Si se registra un coleccionista con más de 100 juegos, queremos preguntarle por qué necesita tantos. Por ejemplo, pueden tener una tienda o simplemente disfrutar coleccionándolos. Entonces, para agregar una regla condicional de este tipo, usamos el método Validator.

    $v->a veces("motivo", "requerido|max:500", function($entrada) ( return $entrada->juegos >= 100; ));

    El primer parámetro de este método es el nombre del campo que estamos revisando. El segundo parámetro es la regla que queremos agregar si la función de cierre pasada (tercer parámetro) devuelve verdadero. Este método facilita la creación de reglas de validación de entrada complejas. Incluso puede agregar las mismas reglas condicionales a varios campos al mismo tiempo:

    $v->a veces(array("razón", "costo"), "requerido", función($entrada) ( return $entrada->juegos >= 100; ));

    Nota: El parámetro $input pasado al cierre es un objeto Illuminate\Support\Fluent y se puede usar para leer archivos y entradas validadas.

    Mensajes de error propios

    Puede proporcionar mensajes de error personalizados en lugar de los predeterminados. Hay varias formas de hacer esto.

    Pasando sus mensajes al Validador

    $mensajes = matriz("requerido" => "Campo:el atributo debe ser completado.",); $validador = Validador::make($entrada, $reglas, $mensajes);

    Nota: string:attribute se reemplazará con el nombre del campo que se está verificando. También puede utilizar otras cadenas de variables.

    Uso de otras variables de cadena

    $mensajes = array("igual" => "El :atributo y :otros valores deben coincidir.", "tamaño" => "El:campo de atributo debe ser exactamente igual a:tamaño.", "entre" => "El:valor del atributo debe ser de:min a:max.", "in" => "Field:attribute debe tener uno de los siguientes valores: :values",);

    Especificación de un mensaje personalizado para un solo campo

    A veces, es posible que deba proporcionar un mensaje personalizado para un campo en particular.

    $mensajes = array("email.required" => "¡Necesitamos saber su dirección de correo electrónico!");

    Especificación de sus propios mensajes en el archivo de localización

    También es posible definir mensajes de validación en el archivo de localización en lugar de pasarlos directamente al validador. Para hacer esto, agregue mensajes a la matriz personalizada del archivo de localización app/lang/xx/validation.php.

    "personalizado" => array("correo electrónico" => array("requerido" => "¡Necesitamos saber su dirección de correo electrónico!",),),

    Reglas de validación propias

    Registro de su propia regla de validación

    Laravel viene con muchas reglas útiles listas para usar, pero es posible que deba crear las suyas propias. Una forma de registrar una regla arbitraria es a través del método Validator::extend.

    Validator::extend("foo", function($atributo, $valor, $parámetros) ( return $valor == "foo"; }); !}

    Nota: el nombre de la regla debe tener el formato_con_guiones bajos.

    El cierre pasado toma tres parámetros: el nombre del campo $attribute a comprobar, el valor del campo $value y la matriz de parámetros $parameters pasada a la regla.

    En lugar de una función, puede pasar una referencia a un método de clase al método de extensión:

    Validador::extender("foo", " [correo electrónico protegido]");

    Tenga en cuenta que también deberá definir un mensaje de error para la nueva regla. Puede hacer esto pasándolo como una matriz de cadenas al Validator o escribiéndolo en un archivo de localización.

    Extendiendo la clase Validator

    En lugar de utilizar funciones de cierre para ampliar el conjunto de reglas disponibles, puede ampliar la propia clase Validator. Para ello, cree una clase que herede Illuminate\Validation\Validator . Puede agregar nuevos métodos de validación comenzando su nombre con validar.

    Registro de una nueva clase de validador

    A continuación, debe registrar esta extensión de validación. Puede hacer esto, por ejemplo, en su proveedor de servicios o en sus archivos de inicio.

    Validator::resolver(function($traductor, $datos, $reglas, $mensajes) ( return new CustomValidator($traductor, $datos, $reglas, $mensajes); ));

    A veces, al crear su propia clase de validación, es posible que deba definir sus propias cadenas de variables (como ": foo") para reemplazar en los mensajes de error. Esto se hace creando una clase como se describe arriba y agregando funciones con nombres como replaceXXX.

    Función protegida replaceFoo($mensaje, $atributo, $regla, $parámetros) ( return str_replace(":foo", $parámetros, $mensaje); )

    Si desea agregar su mensaje sin usar Validator::extend , puede usar el método Validator::replacer:

    Validator::replacer("regla", function($mensaje, $atributo, $regla, $parámetros) ( // ));