You don't have access to this class

Keep learning! Join and start boosting your career

Aprovecha el precio especial y haz tu profesión a prueba de IA

Antes: $249

Currency
$209
Suscríbete

Termina en:

1 Días
8 Hrs
10 Min
36 Seg
Curso de Introducción a Laravel 6

Curso de Introducción a Laravel 6

Profesor Italo Morales F

Profesor Italo Morales F

Validación de datos (rutas, vistas, formularios y controladores)

10/37
Resources

How to validate HTTP requests efficiently in Laravel?

In the fascinating world of web development, good practices are the key to clean and efficient code. One of the fundamental steps in creating secure and robust applications is the validation of HTTP requests. Let's explore how to do it correctly in Laravel, a tool that, despite its flexibility, encourages the adoption of code quality standards.

What does validation in Laravel involve?

Validation in Laravel refers to the application of filters on HTTP requests to ensure that the data we receive meets certain criteria. For example, when we create a user, we want to make sure that the email is valid, that the password has a minimum number of characters, and that the name is a required field. Validation prevents incorrect or malicious data from entering our database.

How do we separate the code to validate correctly?

Previously, validation was often implemented directly in the drivers. However, good practice suggests separating this logic into different files, raising the quality and maintainability of the code. Here we will create a new project, configure the paths and views, and develop a specific file to handle validation.

  1. Create Projects:

    • Open a new project in Laravel. You can do it from your terminal or console.
    • Assign a relevant name to identify it easily and quickly, such as Forvikue.
  2. Configure Routes:

    • Make sure the routes are properly configured in the routes file to redirect to the correct views or controllers.
    • Here the route is used to service the save logic, using post.store.
  3. Create Form:

    • From the views, create a form associated with the fields you are trying to validate, such as the title.
    • Be sure to use secure methods such as CSRF to protect the requests.

How do we develop the validation file?

The key here is to create a Request Form, a special class in Laravel that will host our validation rules.

php artisan make:request PostRequest

This console command will generate a file inside the Requests folder. There, we define the validation rules that will be used by the controller.

public function rules(){ return [ 'title' => 'required', ];}

This simple fragment ensures that the title field is required before any operation, such as saving data.

Why is it important to isolate the validation?

Separating the validation in a separate file allows us:

  • Code Reuse: Validation rules can be reused in multiple controllers.
  • Clean Code: It avoids logic overload in the controllers, keeping the code more readable and easy to debug.
  • Scalability: Facilitates project modification and growth, since the logic is tidy and well defined.

Implementation and testing

Let's suppose that you have already performed the previous steps. When testing the application, by submitting a form with an empty title, the system should not respond until the requirement is met.

By using these techniques, we keep our controller clean, and our application robust and secure. Laravel offers not only flexibility, but the option to implement best practices. Implementing them is up to us, the developers.

Stay motivated and keep adapting these practices in your future developments to ensure high quality applications and stay on the cutting edge of Laravel development.

Contributions 38

Questions 6

Sort by:

Want to see more contributions, questions and answers from the community?

En Laravel 8.x, en las rutas me quedo así:

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\PageController;

Route::get('/', function () {
    return view('post');
});

Route::post('post', [PageController::class, 'store'])->name('posts.store');

Validación de datos (rutas, vistas, formularios y controladores)


Cuando hablamos de validación nos referimos a filtros de peticiones HTTP en un sistema.

  • dd() → Este método muestra en detalle que tiene una variable y detiene la aplicación.

La lógica de validación no debe de estar en el controlador, debe de estar en un Request. Para crear vamos a utilizar el comando:

php artisan make:request PostRequest

Y en el archivo vamos a cambiar el dato que retorna el método authorize() por True. Así:

<?php

class PostRequest extends FormRequest {
    public function authorize() {
        return true;
    }

    public function rules() {
        return [
            // Aquí va la lógica
        ];
    }
}

Y nuestro controlador terminaría así:

<?php

namespace App\Http\Controllers;

use App\Models\Post;
use App\Http\Requests\PostRequest;
use Illuminate\Http\Request;

class PostController extends Controller {
    public function store(PostRequest $request) {
        dd($request->all());
    }
}

Si el form les genero esta vista:

Debe autoriza el FormRequest y pasarlo a true:
PostRequest.php

 public function authorize()
    {
        return false;
    }

Podemos retornar mensajes de error personalizados con la funcion messages

public function messages()
    {
        return [
            'name.required' => 'mensaje personalizado',                                
        ];
    }```

Así seria el Form Request Para validar Users

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StoreUserRequest extends FormRequest
{

    public function authorize()
    {
        return true;
    }


    public function rules()
    {
        return [
            'name' => ['required'],
            'email' => ['required','email','unique:users'],
            'password' =>['required','min:8']
        ];
    }
}

dd() .- es equivalente a var_dump() de php puro.
Cuando creamos un Request tenemos la función rules() donde ponemos las validaciones, también podemos poner la función messages() donde podemos personalizar el mensaje que queremos que nos envié cuando haya algún error. Ya que cuando tenemos algún error al enviar el formulario, nos envía la información en ingles.
Ejemplo:

public function messages()
{
    return [
        'title.required' => 'Un titulo es requerido,
        'body.required'  => 'Un mensaje es requerido',
    ];
}```

para los que estan en laravel 8


use App\Http\Controllers\PostController;

Route::post('post', [PostController::class, 'store'])->name('posts.store');

Utilizando laravel 8.12 y siguiendo con el ejemplo de registro de usuarios, queda de la siguiente forma…

Controlador:

<?php

namespace App\Http\Controllers;

use App\Models\User;
use App\Http\Requests\UserRequest;

class UserController extends Controller
{

    public function store(UserRequest $request)
    {
        
        User::create([
            'name' => $request->name,
            'email' => $request->email,
            'password' => bcrypt($request->password),
        ]);

        return back();
    }
}

UserRequest.php

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class UserRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'name' => 'required',
            'email' => 'required|email|unique:users',
            'password' => 'required|min:8',
        ];
    }
}

Podemos utilizar en Visual Studio Code Laravel Blade Snippets, que nos ayuda a autocompletar el código.

Interesante, yo siempre hacía las validaciones desde el mismo controlador, ahora veo que se pueden dividir mucho más haciendo las validaciones en un archivo a parte:D

Para las personas que tengan problemas con el servidor, yo en mi caso no uso ninguno para este curso, solo uso el comando:

php artisan serve

el cual les abrira una ruta en localhost para usar el servidor
Solo la abren en su navegador y listo, ya pueden navegar en el proyecto

Para crear un archivo de Request desde la consola y la ayuda de Laravel ejecutamos el siguiente comando

php artisan make:request PostRequest

Aqui podran ver mas informacion sobre las validaciones.
https://laravel.com/docs/8.x/validation

Con respecto a las validaciones, ¿que validaciones colocar en el middleware y que validaciones colocar en la clase PostRequets?

Entonces debo crear un archivo request por cada controller?

dd - Helper que me ayuda a inspeccionar lo que estamos recibiendo, esto muestra en detalle lo que tiene una variable, me muestra lo que estoy obteniendo a través de Request.

Recuerden que ahora se hace de declara de esta manera: en el web.php

use App\Http\Controllers\PostController;

Route::post('post', [PostController::class, 'store'])->name('posts.store');

Yo obtuve el siguiente error al procesar la información del formaulario:

Lo pude resolver agregando lo siguiente en la sección del formulario.

class PostController extends Controller
{
    public function store(PostRequest $request){
        dd($request->all());
    }
}

Si desean saber mas sobre las validaciones en laravel pueden consultar el siguiente enlace :
Validaciones Laravel 6
Validaciones Laravel 7
Validaciones Laravel 8

Se pueden personalizar los mensajes de validación agregando la función messages() en el Request:

public function authorize()
    {
        return true;
    }


    public function rules()
    {
        return [
            'tittle' => 'required'
        ];
    }

    public function messages()
    {
        return [
            'tittle.required' => 'El título es obligatorio'
        ];
    }

y para mostrarlo en la vista se puede colocar el mensaje justo después de cada input:



 <form action="{{route('post.store')}}" method="POST">
        @csrf

          <input type="text" name="tittle">
          <div>
          @foreach($errors->get('tittle') as $message)
            <span>{{$message}}</span>
          @endforeach
          </div>

          <input type="submit" value="Enviar">
  </form>




Excelente Curso sigo el paso a paso y le hago mis modificaciones quedando super bien con el apoyo de todos.

Me aparece un error al presionar el botón, antes de poner las validaciones, aún que tengo el código igual que la clase:

Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException
The GET method is not supported for this route. Supported methods: POST.

En las rutas esta definido el metodo get, ayuda por favor.

Profe usted usa laragon?. porque le sale la ruta con .test

Excelente las validaciones!!

Lo logré hacer jejeej, muy buena clase

Super! 😃

La lógica de validación de las peticiones ósea los request no deben de estar en el controlador ya que no es una buena practica

Cuando se crea el Request este crea dos métodos:
uno llamado authorize y otro rules
para que este Request sea usado por nuestro controlador debemos de cambiar el parámetro que se recibe con el nombre de nuestro request y además importarlo para que funcione correctamente

Laravel no obliga a usar las buenas practicas pero te provee de todo lo necesario para implementar las buenas practicas de por ejemplo poder aislar la validación en otro archivo independiente

Laravel nos permite aislar la lógica de validación, para tener a nuestro controlador completamente limpio.

Laravel te permite tener un codigo muy limpio al implementar buenas practicas

Laravel no te obliga a usar buenas prácticas, sin embargo te provee de las herramitas para usarlas.

por ejemplo, quiero usar el mismo request, tanto al guardar y editar, como seria?
hasta ahorita creo dos request para posts

dd($request->all());

Muestra en detalle lo que tiene una variable y detiene la aplicación.

php artisan make:request PostRequest

Comando que se utilizan para crear un archivo para separar la lógica de validación.

Ejemplo de como validar errores y mostrarlos en pantalla, más información en el link:

Uso de la variable $errors

<div class="content">
            <div class="title m-b-md">
                Form Request
            </div>

            <!-- Mostrar errores usando la variable $errors vinculada a la vista por medio del Middleware -->
            @if ($errors->any())
            <div class="alert alert-danger">
                <ul>
                    @foreach ($errors->all() as $error)
                    <li>{{ $error }}</li>
                    @endforeach
                </ul>
            </div>
            @endif

            <form action="{{ route('posts.store') }}" method="POST">
                <!-- Crea un token indicando a laravel que el formulario es nuestro -->
                @csrf
                <input type="text" name="titulo">
                <input type="submit" value="Enviar">
            </form>

        </div>

También existe otra alternativa que es usando la directiva de blade llamada @error, la cual revisa rápidamente si existe un mensaje de error sobre un atributo dado y podemos simplemente imprimirlo.

<!--Directiva @error  -->
            @error('titulo')
            <div class="alert alert-danger">{{ $message }}</div>
            @enderror

Resultado

Documentación de para las validaciones Laravel 8.x

https://laravel.com/docs/8.x/validation#available-validation-rules

Para la versión de Laravel 8.x hay una pequeña modificación que hacer en el archivo web.php que esta dentro de la carpeta “routes”. Así como aquí te vas a encontrar con algunos cambios en la sintaxis. Revisa la documentación.

use App\Http\Controllers\PostController;
use Illuminate\Support\Facades\Route;
.
.
.
Route::get('/', function() {
    return view('post');
});

Route::post('post', [PostController::class, 'store'])->name('posts.store');