No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

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
Recursos

Aportes 38

Preguntas 6

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

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