Contenido del curso

Crear preguntas en un foro con Laravel

Resumen

Dar vida a un foro implica permitir que los usuarios publiquen contenido. Aquí aprenderás a crear una pregunta en Laravel usando rutas resource, un formulario reutilizable con Blade y validación del lado del servidor, ideal para quienes están construyendo un módulo de foro o blog con autenticación y categorías.

La lógica se apoya en dos rutas (create y store), un controlador que conecta vista y base de datos, y una capa de seguridad que protege los campos asignables del modelo.

¿Cómo se configuran las rutas create y store en el foro?

Todo flujo de creación en Laravel necesita dos rutas: una que muestre el formulario y otra que reciba los datos y los guarde. El botón Preguntar del home apunta a preguntas.create, una ruta que aún no existe hasta registrarla en web.php [01:00].

Dentro del recurso de rutas encuentras varias acciones disponibles: mostrar, eliminar, listar, crear y guardar. Activas create y store porque trabajan en pareja:

  • create muestra el diseño del formulario.
  • store ejecuta la acción contra la base de datos.
  • Ambas comparten el mismo controlador.

¿Por qué Laravel separa create y store? Porque una ruta entrega la vista al usuario (GET) y la otra procesa el envío del formulario (POST). Esa separación es estándar en arquitecturas REST.

¿Qué hace el método create del controlador?

El método create no solo retorna la vista. También consulta todas las categorías con Category::all() y las pasa al formulario para llenar el select de manera dinámica [02:10]. Sin esa consulta, el usuario no podría asociar su pregunta a una categoría existente.

¿Cómo se arma el formulario reutilizable con Blade?

La vista crear.blade.php vive dentro de resources/views/preguntas. Dentro incluye un parcial llamado _form.blade.php, que es un archivo Blade pensado para no usarse solo, sino para incluirse en otras vistas como la de edición.

El guion bajo (_) al inicio del nombre es una convención que indica que ese archivo es un partial. Así reutilizas el mismo formulario tanto al crear como al editar una pregunta y evitas duplicar código.

Dentro del parcial pasan varias cosas importantes:

  • La acción del formulario apunta a la ruta store por su nombre.
  • Un foreach recorre las categorías y genera cada <option> con el ID como value y el nombre como texto visible.
  • Los campos título y descripción recuperan datos con la directiva old() cuando la validación falla.

¿Cómo se mantiene la categoría seleccionada tras un error de validación?

Los inputs de texto se recuperan fácil con old('titulo'), pero un select necesita lógica adicional. Dentro del foreach agregas una condición: si category_id coincide con old('category_id'), imprimes el atributo selected en esa opción [05:30]. Así el usuario no pierde su elección al corregir errores.

¿Qué validaciones aplicar en el método store?

El método store valida antes de tocar la base de datos. La regla para la categoría no solo exige el campo, también verifica que el ID exista realmente en la tabla categories, evitando que alguien envíe IDs falsos.

Las reglas quedan así:

  • category_id: requerido y debe existir en la tabla de categorías.
  • título: requerido, tipo string, máximo 255 caracteres.
  • descripción: requerida y de tipo string.

¿Qué hace la regla exists en Laravel? Consulta la tabla indicada y confirma que el valor enviado existe. Es una defensa contra manipulación del formulario desde el navegador.

Tras validar, creas la pregunta pasando el user_id (temporalmente fijado en 20 hasta integrar autenticación), la categoría, el título y la descripción. Luego rediriges a la vista show de la pregunta recién creada [07:45].

¿Por qué aparece el error de asignación masiva?

Al ejecutar Pregunta::create([...]) Laravel lanza un error si los campos no están declarados como asignables. Esa es la capa de seguridad del modelo: te obliga a declarar explícitamente qué columnas pueden llenarse desde un array.

Dentro del modelo Pregunta registras en el arreglo $fillable los campos user_id, category_id, titulo y descripcion. Sin esa declaración, ningún campo se guarda y la creación falla [09:20].

¿Cómo se prueba el flujo completo de creación?

Desde el home haces clic en Preguntar, llenas el formulario con título, descripción y categoría, y al enviar el sistema valida cada campo. Si todo pasa, se crea el registro con su usuario asociado y te redirige a la vista de detalle.

La pregunta queda lista para recibir respuestas y aparece en el home junto al resto del contenido del foro. El siguiente paso natural es activar la edición usando el mismo _form.blade.php que ya construiste.

Ahora tu sistema permite abrir conversaciones. ¿Cómo aplicarías esta misma lógica de create y store en el módulo blog? Cuéntame en los comentarios qué validaciones agregarías a un post.