No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Aprende todo un fin de semana sin pagar una suscripci贸n 馃敟

Aprende todo un fin de semana sin pagar una suscripci贸n 馃敟

Reg铆strate

Comienza en:

5D
19H
4M
19S
Curso de PHP con Laravel

Curso de PHP con Laravel

H茅ctor Benitez

H茅ctor Benitez

Validaciones

18/25
Recursos

Es muy importante validar siempre la informaci贸n que los usuarios ingresan en el sistema. En la mayor铆a de los casos tendr谩s usuarios bien intencionados que s贸lo busquen hacer uso del sistema, pero puede ocurrir que haya alg煤n atacante que quiera obtener informaci贸n que no le pertenece.

Cuando por ejemplo se hace submit a un form vac铆o, no vamos a querer que el usuario final vea los errores como son lanzados sino manejarlos de alguna manera, as铆 que los validamos con ayuda de Laravel.
Laravel incluye todos los errores de validaci贸n que podamos encontrar dentro de un objeto especial llamado errors el cual podemos usar en nuestro template.

  • Se utiliza la l铆nea vertical | para agregar m谩s validaciones.
  • Si un usuario se equivoca al llenar los campos de formulario y al intentarlo de nuevo debe ingresarlos todos otra vez, eso significar谩 una mala experiencia de usuario y crear谩 frustraci贸n. Por esto mismo se deben poner de nuevo los valores y para esto Laravel nos ofrece un auxiliar especial llamado old que podemos usar en el valor del campo.

Aportes 41

Preguntas 4

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

o inicia sesi贸n.

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

  • Primero
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',
    ];
}

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');
    }
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:

  1. Modificar el m茅todo update dentro del archivo ExpenseReport:
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');
    }
  1. Agregar el error al template:
<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>

Excelente, y manejar errores por JS???鈥欌

H茅ctor menuda pasada de curso que te has marcado!!! MIL GRACIAS!!!

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

Les comparto la validaci贸n que hice para la edici贸n de reportes, ya que si solo colocamos old(鈥榯itle鈥) 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">

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.

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([
鈥榥ombreInput鈥 => 鈥榁alidacionDeLaravel鈥
]);

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=鈥渁lert 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 鈥榤in:numeroCaracteres鈥, y para separar las validaciones se usa el caracter 鈥榺鈥, de esta manera:

  • 鈥榯itle鈥 => 鈥榬equired|unique:posts|max:255鈥

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(鈥榯itle鈥) }}"

Para colocar los mensajes de erroe en espa帽ol o, en utilizar uno dise帽ado por mi, como debo de hacerlo?

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

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.

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([
鈥榯itle鈥 => 鈥榬equired|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>

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', 
        ]
        );

Necesitamos tener validaciones en nuestro proyecto para asegurarnos que los datos ingresados son correctos.

Para profundizar mas se deben leer los metodos de validacion disponibles en laravel https://laravel.com/docs/5.8/validation#available-validation-rules

En el metodo store que se encarga de cargar la informacion aplicamos el metodo validate con la siguiente sintaxis
$variable = $request->validate([
鈥榥ombredelcampo鈥 => 鈥榲alidate鈥 (O cualquiera de las otras validaciones)
]);

Se pueden concatenar validaciones usando el operador | con la siguiente sintaxis:

En el metodo store que se encarga de cargar la informacion aplicamos el metodo validate con la siguiente sintaxis
$variable = $request->validate([
鈥榥ombredelcampo鈥 => 鈥榲alidate | min:3鈥 (En este caso se valida que el campo no venga vacio y tenga un largo de al menos 3 caracteres)
]);

Para usar la propiedad de laravel que muestra los errores podemos implementar la sintaxis:
@if ($errors->any())
<div class=鈥渁lert alert-danger鈥>
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif (En la vista del formulario)

  • Y para evitar que todos los campos se vacien perdiendo la data luego de las validaciones podemos colocar en los atributos del input 鈥榲alue鈥="{{old(鈥榯itle鈥)}}"

Validaciones en el vista edit

<input type="text" name="title" id="title" class="form-control" value="{{ old('title', $expenseReport->title) }}" placeholder="Type a Title">

Les comparto el link actualizado de las Validaciones en la documentaci贸n de Laravel
https://laravel.com/docs/7.x/validation

Las validaciones con Laravel son una elegancia, ahorran mucho tiempo y no tenemos que re inventar la rueda 馃憣
.

Excelente!

Recuerden que esta validaci贸n esta en la vista de crear, falta agregarlo a Actualizar

cuando valido el title me sale esto

Method validate does not exist.

Yo hice eso
<input type=鈥渢ext鈥 required class=鈥渇orm-control鈥 id=鈥渢itle鈥 placeholder=鈥淭ype a title鈥 name=鈥渢itle鈥>

Las validaciones no seria mejor si estan dentro del model, porque si queremos hacer una API podemos usar la misma logica de negocio, y no replicar en cada controller.

quien me ayuda !!! me sale error en validation

Buenas compa帽eros dejo mi peque帽o aporte, para validar el email o un dni, pero cuando EDITAMOS un estudiante(en mi caso) les dejo mis validaci贸n:

// validamos los campos
$datosValidado = $request->validate([
            'estudianteNombre'      => 'required|min:3|max:50',
            'estudianteApellido'    => 'required|min:3|max:50',
            'estudianteDNI'         => ['required','numeric',Rule::unique('estudiantes','estudianteDNI')
	->ignore($estudiante->estudianteDNI,'estudianteDNI')], 
            'estudianteDomicilio'   => 'required|max:100',
            'estudianteEmail'       => ['email','max:100',Rule::unique('estudiantes','estudianteEmail')
	->ignore($estudiante->estudianteId, 'estudianteId') ], 
            'estudianteTelefono'    => 'max:50',
            'estudianteLocalidad'   => 'required|max:100',
            'estudianteNacimiento'  => 'required|date',
            'estudianteFoto'        => ''
        ]); 
 

lo que estoy haciendo en estudianteDNI y estudianteEmail es que esos campos sean unic贸 pero que ignore el valor que estoy modificando y as铆 no genere un error.
Saludos.

excelente clase 馃槃

Excelente clase con las validaciones y los valores anteriores para mejorar la experiencia de usuario

 public function update(Request $request, $id)
    {
        $validData = $request->validate([
            'title' => 'required|min:3'
        ]);

        $report = ExpenseReport::findOrFail($id);
        $report->title = $validData['title'];
        $report->save();

        return redirect('expense_reports');
    }```

Muy buena explicacion

Excelente clase, todo muy bien explicado.

Hector que bien

Thanks 馃槂

Podemos en lugar de dejar el c贸digo de los errores en la vista, pasarlos a una nueva vista por ejemplo views/errors/validation.blade.php

//views/errors/validation.blade.php
@if ($errors->any())
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
                <li>
                    {{ $error }}
                </li>
            @endforeach
        </ul>
    </div>				
@endif

Y en las vistas create y edit lo que hacemos es un include a la vista nueva

@include('errors.validation')

Y asi continuamos reutilizando c贸digo.

Pueden traducir los errores de validaci贸n modificando los archivos que se encuentran en la carpeta resources/lang

Aqu铆 nos muestran que hacemos una validaci贸n usando el m茅todo validate, es correcto, pero si recordamos lo que aprendimos en el curso anterior, la manera correcta es hacer un Request validate mediante la consola para no combinar nuestra l贸gica de validaci贸n con el resto:D!

una muy buena pr谩ctica es agregando un FormRequest para el formulario y pasarlo como par谩metro al m茅todo Store