Gustavo Jara
Jorge Luis Chavarriaga Vargas
buen aporte
Alberto Ramírez Caballero
Justo lo estaba revisando porque también me pasaba, gracias!
¿Cómo darle vida al formulario con Laravel?
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:
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:
public function destroy($id) { // Encuentra el registro por ID $post = Post::findOrFail($id); // Elimina el archivo de imagen asociado Storage::delete('public/'.$post->image); // Elimina el registro $post->delete(); // Redirecciona con mensaje de éxito return redirect()->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:
public function update(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ágenes if ($request->hasFile('image')) { // Elimina la imagen anterior Storage::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 éxito return redirect()->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.
Gustavo Jara
Jorge Luis Chavarriaga Vargas
buen aporte
Alberto Ramírez Caballero
Justo lo estaba revisando porque también me pasaba, gracias!
Carlos Mario Martínez González
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.
Marco Antonio Leon Matias
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.
Ejecuta el siguiente comando:
php artisan vendor:publish --provider="Cviebrock\EloquentSluggable\ServiceProvider"
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,
Yeison David Sanabria Ascanio
Julian David Alzate Cuervo
Genial, me funcionó en laravel 9
Jimmy Buriticá Londoño
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.
Carlos Eduardo Gomez García
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
Carlos Eduardo Gomez García
Interesante, hasta ahora he seguido todo el curso y en mi caso todo va perfecto!
Susana Piñero Rodríguez
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
Carlos Eduardo Gomez García
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
Miguel Angel Muñoz Pozos
Hola tengo un problema cuando doy clic en actualizar solo recargar la pagina
Gustavo Jara
Puedes mostrar tu codigo? Gracias! Saludos!
Miguel Angel Muñoz Pozos
Hola ya lo resolví, era la declaración de una variable pero con este código me di cuenta de este error
<ul> @foreach ($errors->all() as $error) <li>{{ $error }}</li> @endforeach </ul>
Usuario anónimo
UserTambién pueden ir a conf y agregar otra carpeta con visibilidad publica si quieren ir ordenando las fotos en carpetas por proyecto:
Archivo: config->filesystems.php
'posts' => [ 'driver' => 'local', 'root' => storage_path('app/posts'), 'url' => env('APP_URL').'/storage', 'visibility' => 'public', ],
Luciano Nicolas Pereira
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.
Edgar Ramón González Contreras
Muestra el código de tu método eliminar y de paso una captura del error de la consola, porfa c:
Luciano Nicolas Pereira
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.
Guillermo Camacho
Carlos Eduardo Gomez García
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
Carlos Araujo
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.
Este es el código de web.php:
Route::get(’/’, ‘PageController@posts’); Route::get(‘blog/{post}’, ‘PageController@post’)->name(‘post’);
Auth::routes();
Route::get(’/home’, ‘HomeController@index’)->name(‘home’);
Route::resource(‘posts’, ‘Backend\PostController’) ->middleware(‘auth’) ->except(‘show’);
Como puedo solucionar?
Bulmaro Arellano Navarrete
Hola,
Revisa estas 2 líneas:
Route::get(’/’, ‘PageController@posts’); Route::get(‘blog/{post}’, ‘PageController@post’)->name(‘post’);
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
Sebastian Vizcarra
Carlos Araujo
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?
Carlos Eduardo Gomez García
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? 🤔
Carlos Araujo
Route::get('/', 'PageController@posts'); Route::get('blog/{post}', 'PageController@post')->name('post');
Auth::routes();
Route::get('/home', 'HomeController@index')->name('home');
Route::resource('posts', 'Backend\PostController') ->middleware('auth') ->except('show');
Cristian Andres Bustos Ayala
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
José Enrique Pérez Aquino
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?
Edgar Ramón González Contreras
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_filesize post_max_size = 40M
con esto en teoría debe funcionar.
max rioseco
Método destroy cuando image es null produce excepción en Laravel. Fix:
Borrar solamente si $post->image no es null.
public function destroy(Post $post) { if ($post->image != null){ Storage::disk('public')->delete($post->image); } $post->delete(); return back()->with('status', 'eliminado con éxito'); }
Luis Cano
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
Modifica tu código asi:
if ($post->image) { Storage::disk('public')->delete($post->image); }
Luis Cano
José Flores
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
Isabel Carolina Pineda Amaya
Gracias por el aporte , porque me salia un mensaje que user_id no encontrado, pero con $request->validated() lo solucione
Carlos Giovanni Inga Sinche
para los q hicieron mostrando la imagen en el formulario editar y no les deja eliminar un post q no tiene imagen
public function destroy(Post $post) { if($post->image==""){ $post->delete(); }else{ Storage::disk('public')->delete($post->image); $post->delete();//eliminamos post de la bd } return back()->with('status','Eliminado con exito'); }
EDGAR MERCADO GARCIA
Gracias querido, me ahorraste tiempo en revisar . también lo aplique en el update ya que tenia el mismo problema.
Juan José del Aguila López
Marco Antonio Leon Matias
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.
Ejecuta el siguiente comando:
php artisan vendor:publish --provider="Cviebrock\EloquentSluggable\ServiceProvider"
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,
Juan Carlos Pinzón
Él lo configuró en una clase anterior. Por ello no le funciona
Javier Amaya Patricio
Tratamiento de ciclo de uso de Laravel
Creamos rutas -> creamos Controlador -> configuramos -> creamos vista
Para eliminar una imagen debemos usar la clase** storage**
public function destroy(Post $post) { // Eliminación de una imagen Storage::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 flash return back()->with('status', 'Eliminado con éxito'); }
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 file if ($request->file('image')) { Storage::disk('public')->delete($post->image); $post->image = $request->file('image')->store('posts', 'public'); $post->save(); }
Si tienen error para actualizar la imagen, asi lo solucione pasando el post como string, para gente con laravel 8 y 9 😃
public function destroy(Post $post) { Storage::disk("public")->delete((string) $post->image); $post->delete(); return back()->with('status', 'Eliminado con éxito'); }
public function update(PostRequest $request, Post $post) { $post->update($request->all()); if($request->file('file')){ // eliminar la imagen Storage::disk("public")->delete((string) $post->image); $post->image = $request->file('file')->store('posts', 'public'); $post->save(); } return back()->with('status', 'Actualizado con éxito'); }
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..,.
funcion update:
public function update(PostRequest $request, Post $post) { //dd($request->all()); $post->update($request->all()); if($request->file('file')){ $post->image = $request->file('file')->store('posts', 'public'); $post->save(); } return back()->with('status', 'Actualizado con éxito'); } edit.blade.php @extends('layouts.app') @section('content') <div class="container"> <div class="row justify-content-center"> <div class="col-md-8"> <div class="card"> <div class="card-header">Editar Artículo</div> <div class="card-body"> @if (session('status')) <div class="alert alert-success" role="alert"> {{ session('status') }} </div> @endif <form action="{{ route('posts.update', $post) }}" method="POST" enctype="multipart/form-data"> <div class="form-group"> <label>Título</label> <input type="text" name="titulo" class=form-control required value="{{ old('title', $post->title) }}"> </div> <div class="form-group"> <label>Image</label> <input type="file" name="file"> </div> <div class="form-group"> <label>Contenido *</label> <textarea name="body" rows="6" class="form-control" required>{{ old('body', $post->body) }}</textarea> </div> <div class="form-group"> <label>Contenido embedido</label> <textarea name="iframe" rows="6" class="form-control">{{ old('iframe', $post->iframe)}}</textarea> </div> <div class="form-group"> @csrf @method('PUT') <input type="submit" value="Actualizar" class="btn btn-primary btn-sm"> </div> </form> </div> </div> </div> </div> </div> @endsection
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.
Es probable que te haya faltado agregar la ruta en el archivo web.php
Intenta agreagar esto: (Esto funciona para Laravel 8)
Route::get('posts/{id}', [PostController::class, 'destroy']);
El error viene de > League\Flysystem\Filesystem
public function delete(string $location): void { $this->adapter->delete($this->pathNormalizer->normalizePath($location)); }
public function update(PostRequest $request, Post $post) { $post->update($request->all()); // imagen if($request->file('file')) { //eliminar imagen Storage::disk('public')->delete($post->image); $post->image = $request->file('file')->store('posts','public'); $post->save(); } return back()->with('status','Actualizado con éxito'); } /** * Remove the specified resource from storage. * * @param \App\Post $post * @return \Illuminate\Http\Response */ public function destroy(Post $post) { Storage::disk('public')->delete($post->image); $post->delete(); return back()->with('status','Eliminado Con éxito'); }