¿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=newPost();// 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:
¿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:
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!
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
Que buen consejo y bien explicado, gracias
¿Cómo?, referencias por favor y gracias we
Tenia entendido que el all() no era conveniente usarlo.
Es correcto Andrés, al utilizar All podemos aceptar todo lo que se nos envía a través del Request, lo mejor es crear un Request personalizado o ya en el último caso aceptar la petición en el controlador con:
$data=$request->validate([// Validaciones aquí])
Ciertamente usar el metodo all() del request no representa incluso una buena practica en el guardado de datos. Sin embargo hay una buena forma de hacerlo, cuando se utiliza una clase Request Validation como es el caso de Post, podriamos usar el metodo 'validated' y este solo retorna aquellas llaves que han sido estrictamente validadas.
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.phpnamespace App\Http\Requests;//ESTO LO IMPORTAREMOS DESDE PostControllerpublicfunctionauthorize(){returntrue;}publicfunctionrules(){return["title"=>"required","body"=>"required",];}"PostCotroller.phpConectar el archivo de validacion al controller
CAMBIAMOSESTO://use Illuminate\Http\Request;PORESTO://use App\Http\Requests\PostRequest;publicfunctionstore(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();}returnback()->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.phpDebemos avisar que vamos a recibir muchos datos juntos en un form
classPostextendsModel{ 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()
use Illuminate\Support\Facades\Auth;
Auth::user()->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
publicfunctionauthorize(){returntrue;}```
Podrías decir por qué ocurre es error?
Gracias
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:
// imgif($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í:
Estoy trabajando con laravel 8 ¿Como podria usar el auth()->user->id?
¡Hola!, ¿No te funciona de esa manera? En teoría, en Laravel 8 el helper auth() sigue estando disponible, deberías poder usarlo de esa manera, aunque user es un método, prueba con esto:
auth()->user()->id
Me sale este error cuando lo uso
Trying to get property 'id'of non-object
alguien me puede ayudar cuando guardo la imagen me sale asi en mi base de datos
C:\xampp7.4\tmp\phpEE65.tmp
este es el código que tengo
if($request->file('file')){
$post->image = $request->file('file')->store('posts','public');// Salvamos la información $post->save();}
Tuve el mismo problema y estuve cambiando el nombre de las variables en PostController, create.blade.php y Post. No se exactamente que fue lo que causo el problema pero puede que te sirva. Siempre puedes comparar tu codigo con el Github del curso.
Si estas usando la version 7 de laravel y te indica
403 | This action is unauthorized., haz lo siguiente:
Cambiar el valor de false a true en el archivo de validacion: use App\Http\Requests\PostRequest;
publicfunctionauthorize(){returntrue;// 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 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.
Yo pienso que puede ser un problema al validar los datos en PostRequest, de pronto alguna validaciones no esta pasando.
Tengo exactamente el mismo problema, solo me recarga la pagina, no me guarda nada en la base de datos
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
Es de un solo uso, es decir a la siguiente petición ya no existe status
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