Entender Laravel

1

Novedades y herramientas actualizadas en Laravel

2

Desarrollo web con Laravel: proyectos y funcionalidades clave

3

Curso de Laravel 6: Configuración del Entorno de Desarrollo

4

Instalación y configuración de Laravel paso a paso

5

CRUD en Laravel: Crear, Leer, Actualizar y Eliminar Usuarios

6

"Creación de Controladores y Vistas en Laravel"

7

Creación de Formularios y Validación en Laravel con Bootstrap

Comprender los Fundamentos de Laravel

8

Rutas y Controladores en Laravel: Fundamentos Esenciales

9

Protección de Rutas y Controladores en Laravel con Middleware

10

Validación de Formularios en Laravel: Buenas Prácticas y Ejemplos

11

Sistema de Plantillas Blade en Laravel: Creación y Uso Eficiente

12

Implementación de Sistema de Autenticación en Laravel con Bootstrap

Aprender sobre Eloquent ORM

13

Manejo de Bases de Datos con Eloquent en Laravel

14

Relaciones de Tablas y Manipulación de Datos en Laravel

15

Manipulación de Colecciones y Serialización de Datos en Laravel

16

Manipulación de Datos en Bases de Datos con PHP

Crear PlatziPress

17

Creación de un Blog con Sistema de Autenticación y Slugs

18

Configuración de Migraciones, Factories y Seeders en Laravel

19

Configuración de Rutas y Controladores en Laravel para Listado de Posts

20

Configuración Visual y Paginación en Laravel y Vue.js

21

Gestión de Artículos en Laravel: Rutas, Controladores y Vistas

22

Creación de Formularios en PHP con HTML y Bootstrap

23

Validación y Guardado de Datos en Laravel

24

Formulario de Edición de Artículos con Laravel

25

Gestión de Formularios y Archivos en Laravel

26

Integración de Imágenes y Contenido Multimedia en Proyectos Web

Construir Proyecto Final: API con TDD (Intermedio)

27

Testing y Pruebas Funcionales en Laravel: Proyecto Intermedio

28

Pruebas de Software: Ciclo Rojo, Verde y Refactorización

29

Configuración de Proyectos en Laravel: Controladores y Pruebas

30

Desarrollo Guiado por Pruebas en Laravel: Configuración y Ejecución

31

Refactorización y Validación de Código en Pruebas Unitarias

32

Pruebas y Configuración de Controladores en Laravel

33

Actualización de Datos en Controladores: Método y Pruebas

34

Pruebas Unitarias para Método de Eliminación en Bases de Datos

35

Creación y Prueba de Métodos Index en PHP

36

Protección de APIs con Autenticación Token en Laravel

37

Desarrollo de Formularios con Blade y Verbalización de Datos

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 y Guardado de Datos en Laravel

23/37
Recursos

¿Cómo configurar la validación para un formulario en Laravel?

Emprender la tarea de validar datos en un formulario es esencial para garantizar la integridad y seguridad de los datos en nuestras aplicaciones. Laravel proporciona un sistema sencillo y efectivo para realizar estas validaciones. A continuación, te mostramos cómo puedes gestionar esto al trabajar con formularios mediante el uso de Request personalizados.

  • Crear un archivo de validación:

    • Primero, creamos un archivo para manejar todas nuestras validaciones. Un buen enfoque es nombrar este archivo de acuerdo con la entidad que queremos gestionar. Si se trata de un post, entonces el archivo podría ser PostRequest.php.
  • Definir validaciones:

    • Dentro de nuestro archivo de validación, definimos las reglas necesarias. Por ejemplo, si queremos que el campo título sea obligatorio, debemos indicarlo de la siguiente manera en nuestra configuración:
      'title' => 'required',
      
  • Integrar validaciones en el controlador:

    • Importamos el archivo de validación en nuestro controlador y lo utilizamos adecuadamente para validar los datos al enviarlos.

¿Cómo guardar datos y manejar imágenes?

Una vez validada la información, el siguiente paso es guardar los datos de manera adecuada en nuestra base de datos. Esto incluye manejar campos especiales como las imágenes.

  • Guardar registros:

    • Usamos la entidad para crear un nuevo registro. El código podría tener el siguiente aspecto:
      $post = new Post();
      // Asignar campos
      $post->title = $request->input('title');
      // Guardar en la base de datos
      $post->save();
      
  • Manejo de imágenes:

    • Guardar una imagen implica primero verificar si se subió alguna en el formulario. Si es así, se utiliza el método store para mover el archivo al servidor.
    • No se guarda la imagen directamente en la base de datos, sino la ruta de acceso a la imagen:
      if($request->hasFile('image')) {
          $path = $request->file('image')->store('posts', 'public');
          $post->image_path = $path;
      }
      

¿Cómo se realiza un manejo masivo de asignación de datos?

Laravel facilita una funcionalidad de asignación masiva para cargar múltiples campos al mismo tiempo, lo que optimiza y mejora la eficiencia en el manejo de formularios.

  • Permitir asignación masiva:

    • Debemos definir en nuestro modelo qué campos son asignables masivamente asegurándonos de incluir los campos permitidos en nuestro $fillable en el modelo:
      protected $fillable = ['title', 'content', 'image_path', 'user_id'];
      
  • Validar asignación masiva:

    • Asegurúrse de validar adecuadamente que sólo los campos correctos se aceptan al realizar una asignación masiva, para prevenir que datos no deseados se inyecten en la base de datos.

Errores comunes al manejar formularios con imágenes

Durante el desarrollo, podemos enfrentar errores comunes que pueden ser resueltos con simples verificaciones o correcciones.

  • Error en URI:

    • Verifica siempre que las URIs de subida de datos estén configuradas correctamente en el formulario, como por ejemplo el uso de enctype="multipart/form-data" para formularios con archivos.
  • Recepción de datos errónea:

    • Si notas que los archivos se reciben incorrectamente como texto, revisa el atributo mencionado del formulario y asegúrate que esté correctamente configurado para manejar archivos de manera efectiva.

Al cumplir con estas directrices, podemos optimizar y asegurar el proceso de validación y almacenamiento de forma eficaz en un entorno Laravel. ¡Mantén la motivación y sigue aprendiendo para perfeccionar estas técnicas en desarrollo web!

Aportes 31

Preguntas 14

Ordenar por:

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

Nunca es buena idea guardar archivos subidos por los usuarios dentro del servidor que ejecuta PHP ya que esto puede prestarse para fallas de seguridad que un atacante puede explotar, siempre es mejor almacenar dichos archivos en sistemas como S3, Azure Storage, entre otros

Tenia entendido que el all() no era conveniente usarlo.

RESUMEN
GUARDADO DE LA INFO DEL FORM DE CREACION
SISTEMA DE VALIDACION PARA EL FORM

A)
-Crear archivo de validacion: php artisan make:request PostRequest
 "app/Http/Requests/PostRequest.php

namespace App\Http\Requests; 	//ESTO LO IMPORTAREMOS DESDE PostController

 public function authorize()
    {
        return true;
    }
    public function rules()
    {
        return [
            "title" => "required",
            "body" => "required",

        ];
    }





"PostCotroller.php
Conectar el archivo de validacion al controller

CAMBIAMOS ESTO:		//use Illuminate\Http\Request;
POR ESTO :		//use App\Http\Requests\PostRequest;



public function store(PostRequest $request)
    {
        $post = Post::create([
            "user_id" => auth()->user()->id
 //obtener el campo user_id de post ||lo buscamos en autenticados/usuarios/id
        ]+ $request->all() );

        if($request->file("file")){

            $post->image= $request->file("file")->store("posts","public");
            $post->save();
        }
        
        return back()->with("status","Creado con exito");
                        
   }
 //logica FUNCION STORE:   
        //1//creamos un post con el user_id y los datos del form de creacion
        //2//agarramos toda la info del form
        //3// si recibimos img:
            // (la guardamos en carpeta storage/app/public
            //en public se generara la carpeta "posts"
            // ahi se generara una ruta, y esa ruta se guarda en base de datos )
        //4 guardamos
        //5 retornamos a la vista anterior con un alert que dice creado con exit






"Post.php
Debemos avisar que vamos a recibir muchos datos juntos en un form

class Post extends Model
{
    use Sluggable;
    
    
    protected $fillable = [
        'title', "body", 'iframe',"image" ,"user_id"
    ];



Listo ya se guarda el post con la url de la imagen

Automáticamente Laravel cambia el nombre del archivo, lo almacena con un nombre que es una combinación de letras y números, solo conserva la extensión. Con esto garantiza que no se suba una archivo con el mismo nombre.

Una alternativa a la linea en el PostController donde se extrae el id del usuario del que está de momento loggeado para el post puede ir de la siguiente manera

Usado en la clase

'user_id' => auth()->user()->id

Alternativa

'user_id' => Auth::id()

No se olvide que en la carpeta Request/PostRequest.php deben de poner true* en la siguiente function sino les lanzara un error 403

  public function authorize()
    {
        return true;
    }```
 

Implementación del guardado


❗ Los controladores que sean privados se encuentra dentro de la carpeta Controllers/Backend y los que sea público son en Controllers

Para crear un archivo request usamos este comando:

php artisan make:request PostRequest

🧇 Cuando creamos un archivos Request siempre ponemos como nombre el que tenemos como entidad en la database.

Cuando estamos modificando el método de crear, para poder obtener y salvar la imagen creamos esta configuración:

// img
if ($request->file('file')) {
    # Esta configuración está guardando la imagen en la carpeta public
    $post->image = $request->file('file')->store('posts', 'public');
}

Según la lógica que estamos haciendo es ‘Al recibir un archivo debemos salvar ese archivo’, y para esto la configuración sería 'Ese archivo debemos salvarlo para generar una ruta y esa ruta será lo que guardamos en la Database.

Nunca guardamos en la Database un archivo directamente.

Recuerda que para recibir datos tienes que poner esto multipart/form-data en el formulario, así:

<form action="{{ route('posts.store') }}" method="post" enctype="multipart/form-data">

Si les aparece el error:

Function name must be a string

es por que tienen la variable $request de la siguiente forma:

$post = Post::create (['user_id' => Auth()->user()->id]
                 + $request()->all());

Y la forma correcta es

$post = Post::create (['user_id' => Auth()->user()->id]
                 + $request->all());

Sin los (). Ahora si le quieres agregar algo mas de seguridad usa:

$post = Post::create (['user_id' => Auth()->user()->id]+ $request->validated());

Si estas usando la version 7 de laravel y te indica
403 | This action is unauthorized., haz lo siguiente:

  1. Cambiar el valor de false a true en el archivo de validacion: use App\Http\Requests\PostRequest;
 public function authorize()
    {
        return true; // cambiar de false a true. 
    }

Ya que como indica el error 403 | This action is unauthorized. aunque se pasa desapersibido al principio del video es un paso importante.

Creo que algo muy importante a recalcar es que por sobre todo estamos creando código limpio y entendible, es genial todo lo que podemos lograr con pocas lineas de código y todo gracias a Laravel

para los que les da problema con la version 8 al guardar la imagen a la base de datos (si que me dio dolor de cabeza que no lograba que se guarde).
la creación de la carpeta la cree manualmente pero luego la img le envio a esa dirección.
hay que mencionar que le agregue una validación para la imagen
en el archivo PostController.php
espero les ayude con la nueva version de Laravel 8
public function store(PostRequest $request)
{

//return $request->all();

    $post = Post::create([
        'user_id' => auth()->user()->id
    ] + $request->all());



    $request->validate([

        'title'=>'required|min:3|max:20',
        'file' =>'image|mimes:jpg,jpeg,gif,png,svg|max:2048',
        'body' =>'required'
        //'iframe'=>'required' 

    ]);

if ($request->file(‘file’)) {

    $imagenes= $request->file('file')->store('public/posts');
    $url=storage::url($imagenes);
    $post->image = $imagenes;
    $post->save();

    }

return back()->with(‘status’, ‘Creado con éxito’);

} 

Para los que tienen el error de que Requests no existe. Es debido a que el Requests se llama PostRequest. Deben cambiar en la función store el nombre del parametro Request a PostRequest.

Buenas, cuando intento guardar no me arroja ningun error pero no me guarda en base de datos y ni me aparece el mensaje de status.
Cuando inspecciono la pagina y me meto en network veo que el metodo de posts arrojo un mensaje que dice:
“failed to load response data” verifique si todo lo tenia bien escrito y en efecto no tengo errores de tipeo en el codigo… si alguien tiene alguna sugerencia o algo. por favor ayudarme, gracias.

Si poseen problemas con el almacenamiento de imágenes con la siguiente excepcion:

fopen(): Filename cannot be empty

Solo deben configurar el php.init para dar permito a la ruta TEMP

upload_tmp_dir =C:\Windows\Temp

a que se refiere e profe cuando menciona la “variable de sesión de tipo flash que se va a eliminar cuando actualicemos el navegador?” en el minuto 5:59

Excelente por la subida de archivos, lo que guardamos en la BD es la ruta del archivo que subimos

¿Alguien lo esta trabajando con laravel 8?
No me funciona el store, me manda un 302

muy bueno.

**El método store de esta clase **

public function store(PostRequest $request)
    {
        dd($request->all());
        //salvar información
        $post = Post::create([
            // El user_id se rellena con el id del usuario logueado
            'user_id' => auth()->user()->id
        ] + $request->all());

        // trabajar con imagenes
        /* 
            Si recibimos un archivo debemos salvarlos en nuestro proyecto
            para despues almacenar la url de ese archivo en la base de datos.
            Nunca guardamos un archivo como tal en la base de datos.

         */

        if($request->file('file')){
            /*
             Enviamos la imagen al servidor con el método store
             store() -> Store the uploaded file on a filesystem disk.
             El orden de store es el siguiente guardame dentro de public
             en la acrpeta store la imagen y almacena la ruta en el campo image del post.
            */
            $post->image = $request->file('file')->store('posts','public');

            // Salvamos la información
            $post->save();
        }

        // retornar resultado
        // EL método back crea una solicitud de redirección 
        // hacia la ultima ubicación antes de disparar este método
        return back()->with('status','Creado con éxito');
    }

La validación separada del controlador me permite tener código más legible y mantenible, por ello creamos el archivo PostRequest el cual tiene dos funciones

  1. authorize() ->Determina si el usuarios esta autorizado para crear una solicitud

  2. rules() -> En el se escriben las reglas de validación para darle true en la autorización al usuario para así continuar el flujo de trabajo.

public function authorize()
    {
        return true;
    }

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

A mi me arrojaba un error 403 Accion no autorizada, lo solucione poniendole al postRequest en el metodo autorize return true

Para las versiones mas recientes de Laravel, debemos ejecutar el comando `php artisan storage:link` y así lograr el guardado de imagenes.

Comparto mi solucion:

  • he probado otro metodo para almacenar, creando un objeo post primero
  • solo almaceno imagen en caso que la creacion del post es verdadera.
  • validacion del tipo de archivo enviado (solamente permite imagenes)
  • validacion especifica de errores para estilar cada input (realmente tedioso)
    .

Así quedó mi función store utilizando Laravel Sail y Minio

   /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(PostRequest $request)
    {
        $path = $request->file('image')->store('articles', 's3');
        Storage::disk('s3')->setVisibility($path, 'public');

        $input = $request->validated();

        if ($request->file('image')) {
            $input['image'] =  Storage::disk('s3')->url($path);
        }

        Post::create(array_merge($input, ['user_id' => Auth::id()]));

        return back()->with('status', 'Post created successfully');
    }
    public function store(PostRequest $request)
    {
        //salvar
        $post = Post::create([
            'user_id' => auth()->user()->id
        ]+ $request->all());

        //image
        if($request->file('file'))
        {
            $post->image = $request->file('file')->store('posts','public');
            $post->save();
        }

        //retornar
        return back()->with('status', 'Creado con éxito');
    }

super genial

como puedo personalizar el nombre de un archivo recibido al momento de guardarlo?

Gracias

Aquí hay otra opción para las validaciones la cual nos permite instanciar un objeto Validator sobre el request proveniente del usuario.

https://laravel.com/docs/7.x/validation#manually-creating-validators

muy buenas, como llamar funciones de la bd?

Explicación de carpeta publica para almacenamiento de archivos multimedia

excelente explicacion