Validaciones
Clase 18 de 25 • Curso de PHP con Laravel
Contenido del curso
Clase 18 de 25 • Curso de PHP con Laravel
Contenido del curso
Luis Andrés Arce Cárdenas
Andrés Giovanni Vanegas Castañeda
Roberth Jason Rios Jesus
Jimmy Buriticá Londoño
Mauricio Avila Beltran
Alejandro Espitia
Angel Enrique Barrios
Javier Andrés Poduje Alegría
Joseph Alexander Whacheng Barreto
Carlos Irving Gómez Quiroz
Alejandro Espitia
Yordy Alejandro Jiménez Torres
Alfonso Navarro
Lorena Pena Verdú
Oscar Barrón Martínez
Kenneth Angulo L
Sergio VO
Carlos Andres Castañeda Osorio
Raul Mercado
Edwin Donato Dominguez Oliva
Ricardo Portillo
Enrique Garcia Stave
Wilson Alvaro Leonardo Tahuico
Ana Lima
Jose Rosado
Francisco Torregrosa Ros
Francisco Torregrosa Ros
Alexander Sanchez
Cristhian Coaquira
Edward Suarez
David Andrés Rincón Suárez
Lizardo Reyes
Angel Infanti
Matías Consilvio
Jimmy Buriticá Londoño
Para buenas prácticas, no es recomendable manejar las validaciones en los controllers. Laravel en su documentación propone una manera más óptima. De una vez aprovecho para facilitarles el link de la documentación en español, un gran aporte de Styde
Laravel en Español - Validación de formularios
php artisan make:request StoreExpenseReports
Esto creará una Carpeta Request en Http
/** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ 'title' => 'required|min:3', ]; }
En rules, agregarán todas las reglas de validaciones para el modelo correspondiente en este caso Expense Reports
/** * Determine if the user is authorized to make this request. * * @return bool */ public function authorize() { return true; }
En el método authorize vamos a poner true, para que nos permita validar y ejecutar la acción del controller. OJO este método es más extenso en ella podemos validar si un user tiene o no permiso de editar y esas cuestiones.
Por ultimo en nuestro controller,
/** * Store the incoming blog post. * * @param StoreBlogPost $request * @return Response */ public function store(StoreExpenseReports $request) { // The incoming request is valid... // Retrieve the validated input data... $validated = $request->validated(); }
En vez de pasar por parámetro Request. Pasamos la clase que creamos al principio con artisan StoreExpenseReports De esta manera ya está validado y podemos hacer uso de esta misma clase en nuestro metodo Update
Contenido Extra
Modificar mensajes de Error
Dentro de la clase creada al principio crear el método messages y agregar los mensajes de acuerdo al campo y validación de la siguiente.
/** * Get the error messages for the defined validation rules. * * @return array */ public function messages() { return [ 'title.required' => 'A title is required', 'body.required' => 'A message is required', ]; }
Tremendo aporte bro! Gracias
Les comparto la función update() con respuestas en ++español++:
public function update(Request $request, $id) { $validData = $request->validate( ['title' => 'required|min:3'], ['title.required' => 'El titulo es requerido por favor', 'title.min' => 'El titulo es mínimo 3 caracteres por favor']); $report = ExpenseReport::findOrFail($id); $report->title = $validData['title']; $report->save(); return redirect('/expense_reports'); }
Muchas gracias, aunque para cambiar el idioma es más sencillo crear el archivo validation.php dentro de la carpeta resources/lang/es y con las etiquetas se obtiene el mismo esperado.
// resources/lang/es/validation.php return [ 'required' => 'El :attribute es requerido', 'min' => 'El :attribute debe contener minimo :value caracteres' ];
public function authorize() { return true; } /** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ 'name' => 'required|max:255', 'email' => 'required|email|unique:users', 'password' => 'required|min:4', 'role_id' => 'required', ]; } public function messages() { return [ 'name.required' => 'El campo de nombre es requerido', 'email.required' => 'El campo email es requerido', 'email.unique' => 'El email ya esta ocupado', 'password.required' => 'El campo contraseña es requerido', 'password.min' => 'Minimo 4 caracteres', 'role_id.required' => 'El campo rol es requerido', ]; }```
Wow wow wow take it easy..... No sabía que Laravel era tan cool
Respuesta al reto:
public function update(Request $request, $id) { $report = ExpenseReport::find($id); # Validación. La misma que al guardar $validaData = $request->validate([ 'title' => 'required|min:3' ]); $report->title = $request->get('title'); $report->save(); return redirect('/expense_reports'); }
<div class="col"> @if ($errors -> any()) <div class="alert alert-danger"> <ul> @foreach($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif <form class="" action="/expense_reports/{{ $report->id }}" method="POST"> @csrf @method('put') <div class="form-group"> <label for="title">Title:</label> <input type="text" class="form-control" id="title" name="title" placeholder="Title" value="{{ old('title') }}"> </div> <button class="btn btn-primary" type="submit" name="button">Submit</button> </form> </div>
Creo que sería mejor en el Value vaya lo siguiente:
value="@if(!old('title')){{ $report->title }}@else{{ old('title') }}@endif"
En el método Update, ¿no deberían pasarse los elementos validados?:
<code> $validaData = $request->validate([ 'title' => 'required|min:3' ]); $report->title = $validData['title']; //en lugar de.. $report->title = $request->get('title'); $report->save();
¡Excelente curso!.
Una forma de validar los campos sin hacerlo en el controlador es mediante un archivo tipo request y desde este mismo enviar los mensajes a la vista en caso de error.
<code> php artisan make:request NombreRequest
Correcto, más limpio el código y sólo se debe importar el request en la parte superior
Excelente, y manejar errores por JS???????????''
Héctor menuda pasada de curso que te has marcado!!!! MIL GRACIAS!!!!!!
Les comparto la validación que hice para la edición de reportes, ya que si solo colocamos old('title') no nos carga el valor previo a la edición.
<input type="text" class="form-control" id="title" name="title" placeholder="Type a title" value="@if($errors->any()){{old('title')}}@else{{$report->title}}@endif">
Gracias por compartir.
Si necesitan que las validaciones se visualizen en español, pueden ir a este Repositorio y poder instalar este paquete mediante composer:
Instalamos el paquete
composer require laraveles/spanish
A continuacion ingresar el siguiente comando
php artisan laraveles:install-lang
Y por ultimo cambiamos en config/app.php la siguiente linea
'locale' => 'es',
Esto nos dejara todos los mensajes de validación en español.
Por otra parte si quiere tener el debuger de esta manera puede ir al siguiente repositorio . El cual es muy util durante el desarrollo de tus aplicaciones, ya en produccion lo configuras para que no se muestre.
Espero les sirva :)
Otra manera de concantenar validaciones es usar un arreglo en lugar del caracter especial pipe "|". Ejemplo:
$validation = $request->validate([ 'title' => ['required', 'min:3'] ]);
He aceptado un trabajito como freelance y de lo que he encontrado es que ya tienen una aplicación en PHP 5.5 sin framework hosteado en Google AppEngine. Lo que le he propuesto al cliente es que todo lo adicional que me está pidiendo es hacerlo en un nuevo proyecto de Google AppEngine y con PHP 7.2 con Laravel. Este curso y el de Google Cloud AppEngine me están ayudando un montón en sacar este proyecto adelante.
Que bueno!! Cuando comencé a aprender PHP la verdad no me gustaba mucho su sintaxis comparándolo con Javascript o Python, pero Laravel me hizo cambiar de parecer. Además, la manera en la que Hector está enseñando el curso lo hace mucho más disfrutable. Exitos con el proyecto
consejo pasa todos tus proyecto activos a php 7+ ya no se esta dando soporte a php 5. Y te va costar más darle soporte desde los servidores.
Apuntes: Las validaciones son muy importantes en PHP, puesto que de esta manera se asegura que la informacion que ingrese en el sistema sea la correcta, y evita el mal uso del mismo por parte de los atacantes.
Validacion para un insert
Para evitar que un usuario ingrese un formulario vacío (y por ende pueda ver los errores), nos dirigimos al metodo store() y escribimos lo siguiente:
$variableValidacion = $request->validate([ 'nombreInput' => 'ValidacionDeLaravel' ]);
Para una mayor documentacion sobre las validaciones, se puede consultar:
https://laravel.com/docs/5.8/validation#available-validation-rules
De esta forma se impedirá que se imprima un error que termine exponiendo el codigo PHP, sin embargo necesitamos imprimir un reporte al usuario acerca del error, para ello nos vamos a la vista y editamos, de la siguiente manera: @if ($errors->any()) <div class="alert alert-danger"> <ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif
Una manera de evitar que el usuario escriba menos caracteres que los deseados, es con 'min:numeroCaracteres', y para separar las validaciones se usa el caracter '|', de esta manera:
Para evitar que la información se pierda al momento de enviar y no pasar el filtro de validación, se puede escribir como valor del formulario 'value="{{ old('title') }}"
Para colocar los mensajes de erroe en español o, en utilizar uno diseñado por mi, como debo de hacerlo?
Puedes modificar el archivo messages.php y allí customizas los mensajes que trae por defecto Laravel, aquí la documentación
Saludos, para esos casos suelo utilizar este paquete de Laravel Laravel-lang.
Para poner los mensajes de validación en español podemos hacerlo así.
composer require laraveles/spanish
luego de un ratito de proceso
php artisan laraveles:install-lang
Y por ultimo cambiamos en config/app.php la siguiente linea
'locale' => 'es',
Esto nos dejara todos los mensajes de validación en español.
Aquí les dejo el enlace al repo por si necesitan alguna aclaracion
No sale el enlace asi que lo posteo aqui
Yo tenia en el caso del editar, en el input del titulo, el titulo que se modificara. Como se puede hacer para tener lo de old tambien es decir mi código esta asi.
<input type="text" value="{{$report->title}}">
este con el fin de que al momento de querer editar, puede ser que solo se quiera editar una letra o algo mínimo.
Yo lo tengo realizado asi para que obtenga lo que el usuario digito y si no existiera el valor digitado obtenga el valor del registro.
<input type="text" name="title" id="title" class="form-control" value="{{ old('title', $expenseReport->title) }}" placeholder="Type a Title">
validación en el edit.blade.php
@if($errors->any()) <div class="alert alert-danger"> <ul> @foreach($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul> </div> @endif
validación en la clase update del controller
$validData = $request->validate([ ‘title’ => ‘required|min:3’, ]); $report = ExpenseReport::findOrFail($id); $report->title = $validData['title']; $report->save();
Un ejemplo dentro de los controles de la clase Form de Blade, es incluir a required como una propiedad más de un determinado objeto: Ejemplo:
<div class="form-group"> {!! Form::label('title', 'Titulo') !!} {!! Form::text('title', null, ['class' => 'form-control', 'placeholder' => 'Título', 'required']) !!} </div>
Si, es una validación extra en vista, pero muy fácil de saltar editando el html en el navegador.
Me encanta este curso
Para cambiar las respuesta :
$$validDate = $request->validate([ 'title'=>'required|min:3'// sino envia nada ], [ 'title.required' => 'Es requerido por favor', 'title.min' => 'Es minimo 3 por favor', ] );
Muy buen dato, lo probé y funciona perfecto. Gracias.