En la etapa de aprendizaje de Laravel, es crucial entender el ciclo completo de desarrollo que involucra la creación de rutas, controladores y vistas. Laravel ofrece una flexibilidad impresionante al facilitar la creación de formularios mediante el uso de plantillas replicables. Sin embargo, para aprovechar estas ventajas, es necesario comprender meticulosamente cada línea de código. Este proceso consiste en:
Crear una ruta.
Configurar un controlador.
Diseñar una vista.
Con estos pasos, se logra agregar funcionalidad al formulario de creación o modificación de registros y eliminar de manera eficiente. ¿Y qué tal si analizamos algunos ejemplos prácticos de ello?
¿Cómo eliminar un registro con éxito?
Al implementar la función de eliminación en Laravel, se debe considerar tanto el registro en la base de datos como los archivos asociados que estén almacenados, como imágenes. Una vez eliminados, se debe retornar al usuario un mensaje en la sesión informando del éxito de la acción.
Vamos con un ejemplo de código para la eliminación:
publicfunctiondestroy($id){// Encuentra el registro por ID$post=Post::findOrFail($id);// Elimina el archivo de imagen asociadoStorage::delete('public/'.$post->image);// Elimina el registro$post->delete();// Redirecciona con mensaje de éxitoreturnredirect()->route('posts.index')->with('status','Eliminado con éxito');}
¿Cómo actualizar un registro y manejar imágenes?
El manejo de archivos es crucial al actualizar registros que contienen imágenes. Cuando se recibe una nueva imagen, programa el sistema para eliminar la antigua antes de almacenar la nueva. Similar al proceso de eliminación, el usuario es informado del éxito de la actualización.
Ejemplo de implementación de actualización:
publicfunctionupdate(Request$request,$id){$post=Post::findOrFail($id);// Validaciones de título y contenido$validatedData=$request->validate(['title'=>'required|max:255','body'=>'required',]);// Manejo de imágenesif($request->hasFile('image')){// Elimina la imagen anteriorStorage::delete('public/'.$post->image);// Guarda nueva imagen$path=$request->file('image')->store('public/posts');// Actualiza la ruta de la imagen en la base de datos$post->image=basename($path);}// Guardar cambios en el registro$post->update($validatedData);// Redirecciona con mensaje de éxitoreturnredirect()->route('posts.index')->with('status','Actualizado con éxito');}
¿Por qué es importante el manejo de imágenes en Laravel?
El almacenamiento eficaz y administración de imágenes en Laravel garantiza que no se acumulen archivos innecesarios en el servidor. Cada vez que un archivo es actualizado o un registro es eliminado, el sistema debe gestionar adecuadamente estos cambios para liberar espacio. Esto no solo optimiza el rendimiento del servidor sino que además, evita posibles confusiones al mantener exclusivamente los archivos actualmente en uso.
El manejo de imágenes no es complejo, pero sí requiere de un enfoque minucioso. Al trabajar con la clase Storage, se asegura que incluso si se cambia de configuración de almacenamiento en el futuro, como pasar de almacenamiento local a servicios en la nube, el cambio será sencillo y sin fricciones.
Recomendaciones prácticas
Antes de implementar soluciones más complejas, asegúrate de dominar los conceptos básicos de Laravel. Sumérgete en la documentación oficial y explora ejemplos prácticos. Al reforzar tus conocimientos sobre rutas, controladores y vistas, podrás crear aplicaciones robustas y confiables.
Finalmente, recuerda que cada avance en tu aprendizaje abre nuevas oportunidades para construir aplicaciones más complejas y dinámicas. ¡La práctica constante es tu mejor aliada! Sigue adelante y no dudes en experimentar con diferentes configuraciones y optimizaciones que Laravel tiene para ofrecer.
Nota:
En mi caso al editar la imagen, me creaba la nueva imagen, la editaba al post, pero no la borraba.
Entonces tuve que hacer lo que muestro en el fragmento del codigo.
Saludos.
// edito solo esos campos si no viene file$post->update(['title'=> $request->title,'body'=> $request->body,'iframe'=> $request->iframe
]);// si viene con fileif($request->file('image')){Storage::disk('public')->delete($post->image); $post->image = $request->file('image')->store('posts','public'); $post->save();}
buen aporte
Justo lo estaba revisando porque también me pasaba, gracias!
Actualizando nuestros posts
Para eliminar una imagen necesitamos trabajar con esta clase:
useIlluminate\Support\Facades\Storage;
Y para eliminar la imagen pondremos:
Storage::disk('public')->delete($post->image);
La lógica de esta sentencia es que dentro del almacenamiento busque la carpeta public y ahí vas a eliminar la ruta que le de los parámetros, en este caso es $post->image.
Una consulta compañeros quienes han hecho este ejemplo de clase han visto o notado que aunque actualizamos podemos casi cambiar todos por los campos por lo que seria necesarios saber que campos puedo cambiar en reralidad, ya que por ejemplo si cambio el titulo el slug deberia modificarse y no lo hace.
Problema: No se actualiza el slug en DB
Encontré la solución. Tenía el mismo problema. A Italo si se le actualiza pero no lo explica.
Se te creara un archivo, entonces dirígete al archivo siguiente:
config/sluggable.php
Ese archivo retorna un array. En la llave 'onUpdate' cambia el valor a true. De hecho en al archivo mismo te da una explicación.
Quedaría así:
'onUpdate'=>true,
Si tienen error para actualizar la imagen, asi lo solucione pasando el post como string, para gente con laravel 8 y 9 😃
publicfunctiondestroy(Post $post){Storage::disk("public")->delete((string) $post->image); $post->delete();returnback()->with('status','Eliminado con éxito');}
publicfunctionupdate(PostRequest $request,Post $post){ $post->update($request->all());if($request->file('file')){// eliminar la imagenStorage::disk("public")->delete((string) $post->image); $post->image = $request->file('file')->store('posts','public'); $post->save();}returnback()->with('status','Actualizado con éxito');}
Genial, me funcionó en laravel 9
Mi lógica me dice que antes de tratar de eliminar un archivo, primero debo de comprobar si existe. Pero durante el ejercicio siempre se manda a eliminar, así el campo del nombre de archivo este vacío. Lo increíble es que funciona.
Tu lógica está correcta, y así se debe hacer, pero esto es Laravel, el propio método delete ya hace la validación de si el archivo existe jaja
Interesante, hasta ahora he seguido todo el curso y en mi caso todo va perfecto!
Si, también me tiene impactada. Por lo general seguir un curso de programación me tomas mucho más de lo debido solucionando problemas de compatibilidad u.u
Sí, eso siempre es un problema, pero para este curso podrías usar Laravel 6 o 7 y te debería de ir perfecto :D
Hola tengo un problema cuando doy clic en actualizar solo recargar la pagina
Puedes mostrar tu codigo?
Gracias!
Saludos!
Hola ya lo resolví, era la declaración de una variable pero
con este código me di cuenta de este error
Estoy trabajando con php artisan serve. Cuando hago click en 'eliminar' salta el cartel de confirmación. Cuando doy ok no pasa nada, no se modifica nada. y en la consola aparece el siguiente msj:
Closed without sending a request; it was probably just an unused speculative preconnection
Alguna idea de lo que pueda estar pasando? gracias.
Muestra el código de tu método eliminar y de paso una captura del error de la consola, porfa c:
Hola Edgar, gracias por tu tiempo. Revisé el index.blade.php y en type tenia mal escrito el submit. Puse type = submint, eso era todo. Por eso no recibía ninguna accion el servidor.
Hola, quien puede con este dilema:
El create me funciona perfectamente, pero el update me queda en la misma pagina se refresca pero vuelve a como estaba antes de actualizar y no guarda los cambios:
paso el codigo..,.
Como les comento, al pulsar en actualizar, se actualiza la página pero no toma los cambios, y aun si coloco la función dd($request->all()); no me carga nada.
Lo más probable es que la ruta no está bien colocada, si inspeccionas el HTML de tu página ¿qué te aparece en el atributo "action"? 🤔
Ojo, inspeccionar desde tu navegador
Hola me puede ayudar por favor, hasta el min 6:22 todo bien pero no se elimina el post y me sale este error:
Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException
The GET method is not supported for this route. Supported methods: PUT, PATCH, DELETE.
Creo que si modificas el método o verbo get por post, put o patch algo diferente obtendrás como resultado. Observa el error que nos compartes, dice, el método get no está disponible para esta ruta, los métodos soportados son put, patch y delete
Es probable que te haya faltado agregar la ruta en el archivo web.php
Intenta agreagar esto:
(Esto funciona para Laravel 8)
Hola todo bien hasta min 6:22 no se elimina y me sale este error:
Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException
The GET method is not supported for this route. Supported methods: PUT, PATCH, DELETE.
Como puedo solucionar?
Te dice que el método GET no está permitida para esa ruta, tal vez no definiste esa ruta como GET. ¿Puedes poner tu código del archivo routes/web.php? 🤔
Compañeros, al tratar de actualizar a una imagen grande tengo este problema
The "" file does not exist or is not readable.
estoy tratando de actualizar con una imagen que pesa: 2.68 MB
pero funciona con una que pesa 4.10 KB
si alguien sabe le agradeceria :) saludos
Desconozco que tipo de archivos admita. Podría ser la extensión del mismo. ¿Podrías corroborar que ambas imágenes sean del mismo tipo?
Debes buscar tu archivo php.ini si usas vscode, usa ctrl + p y buscalo.
Ya estando ahí debes editar estas variables
//Maximum allowed size for uploaded files.upload_max_filesize = 40M
//Must be greater than or equal to upload_max_filesizepost_max_size = 40M
con esto en teoría debe funcionar.
Método destroy cuando image es null produce excepción en Laravel. Fix:
Borrar solamente si $post->image no es null.
publicfunctiondestroy(Post $post){if($post->image !=null){Storage::disk('public')->delete($post->image);} $post->delete();returnback()->with('status','eliminado con éxito');}
Si estas en Laravel 9 y recibes este error al actualizar y eliminar un post que no tiene imagen (null en la base de datos):
League\Flysystem\Filesystem::delete():Argument #1($location) must be of type string,null given
En laravel 8, en el área de salvar y actualizar, cambien el $request->all(), por $request->validated(), para no tener problemas con la Base de Datos
Gracias por el aporte , porque me salia un mensaje que user_id no encontrado, pero con $request->validated() lo solucione
para los q hicieron mostrando la imagen en el formulario editar y no les deja eliminar un post q no tiene imagen
publicfunctiondestroy(Post $post){if($post->image==""){ $post->delete();}else{Storage::disk('public')->delete($post->image); $post->delete();//eliminamos post de la bd}returnback()->with('status','Eliminado con exito');}
Gracias querido, me ahorraste tiempo en revisar . también lo aplique en el update ya que tenia el mismo problema.
publicfunctionupdate(PostRequest $request,Post $post){ $post->update($request->all());// imagenif($request->file('file')){//eliminar imagenStorage::disk('public')->delete($post->image); $post->image = $request->file('file')->store('posts','public'); $post->save();}returnback()->with('status','Actualizado con éxito');}/**
* Remove the specified resource from storage.
*
* @param \App\Post $post
* @return \Illuminate\Http\Response
*/publicfunctiondestroy(Post $post){Storage::disk('public')->delete($post->image); $post->delete();returnback()->with('status','Eliminado Con éxito');}
Problema: No se actualiza el slug en DB
Encontré la solución. Tenía el mismo problema. A Italo si se le actualiza pero no lo explica.
Se te creara un archivo, entonces dirígete al archivo siguiente:
config/sluggable.php
Ese archivo retorna un array. En la llave 'onUpdate' cambia el valor a true. De hecho en al archivo mismo te da una explicación.
Quedaría así:
'onUpdate'=>true,
Él lo configuró en una clase anterior. Por ello no le funciona
Tratamiento de ciclo de uso de Laravel
Creamos rutas -> creamos Controlador -> configuramos -> creamos vista
Para eliminar una imagen debemos usar la clase** storage**
publicfunctiondestroy(Post $post){// Eliminación de una imagenStorage::disk('public')->delete($post->image);//Eliminar un post usando delete $post->delete();// Creamos una redirección a la vista anterior // enviando feedback al usuario// usando una variable flashreturnback()->with('status','Eliminado con éxito');}