Creando un Foro con el MicroKernelTrait de Symfony (Parte 1)
En esta ocasión voy a escribir una serie de artículos en donde se describirá paso a paso el desarrollo de una aplicación muy simple utilizando el MicroKernelTrait de Symfony, la cual será un Foro donde los usuarios podrán hacer preguntas y responder las preguntas de otros usuarios.
En esta primera parte sólo vamos a instalar y configurar Symfony con el MicroKernelTrait.
Nota: Los posts se enfocarán a usuarios que tengan conocimientos previos de Symfony, que conozcan sobre el AppKernel, los directorios básicos de un proyecto symfony y de los archivos de configuración y rutas.
La aplicación
Para no complicar la aplicación no se tendrán categorías ni se aprobaran preguntas o respuestas, además estás serán las líneas a seguir para el desarrollo de la app:
- No habrán niveles/perfiles de usuario.
- Cualquier usuario logueado podrá crear una pregunta.
- Cualquier usuario logueado podrá responder una pregunta.
- El usuario que creó la pregunta podrá en cualquier momento dar por resuelta su inquietud.
- No habrá registro de usuarios (Existirán unos cuantos usuarios de prueba).
- Habrá un listado de las preguntas del usuario.
Por otro lado, la aplicación constará de los siguientes módulos:
Inicio
Muestra un listado de las preguntas realizadas por los usuarios. En esta página aparece el título de la pregunta, la fecha y un resumen de la descripción de la misma. Las preguntas aparecerán desde las más recientes hasta las más antiguas.
Detalle de Pregunta
Muestra en detalle la pregunta realizada con su descripción y la información del usuario, además muestra las respuestas que los usuarios han hecho previamente, y contendrá un formulario para añadir una respuesta a la pregunta.
Crear Pregunta
Muestra un formulario para crear una pregunta.
Mis preguntas
Muestra un listado de las preguntas realizadas por el usuario logueado. En esta página aparece el título de la pregunta y un resumen de la descripción de la misma. Las preguntas aparecerán desde las más recientes hasta las más antiguas.
Preguntas
La pregunta será realizada por un usuario previamente logueado y constará de las siguientes propiedades:
- id: Identificador interno de la pregunta.
- title: Título de la pregunta.
- description: Descripción de la pregunta.
- author: Usuario autor de la pregunta.
- createdAt: Fecha de creación de la pregunta.
- resolved: Un atributo para que indica si está resuelta su duda.
Respuestas
Las respuestas las harán usuarios previamente logueados y constarán de los siguientes atributos:
- id: Identificador interno de la respuesta.
- author: El usuario que responde.
- question: La pregunta que se está respondiendo.
- response: La descripción de la respuesta.
- createdAt: fecha de creación de la respuesta.
Requerimientos:
- Se debe tener al menos php >= 5.5 ya que se trabajará con Symfony 3 (Aunque se puede trabajar con Symfony 2.8 para php 5.4, que tambien permite el uso de Traits).
- Se debe tener composer instalado en la máquina.
Configurando el Proyecto
Vamos a guiarnos de la documentación oficial para trabajar con el MicroKernelTrait, por lo que lo primero es crear una carpeta para la aplicación, con un nombre como por ejemplo micro-foro.
Instalación
Crearemos un fichero composer.json
con el siguiente contenido:
1 2 3 4 5 6 7 8 9 10 11 12 | { "require": { "symfony/symfony": "^3.1", "sensio/framework-extra-bundle": "^3.0", "doctrine/dbal": "^2.5" }, "autoload": { "psr-4": { "": "src/" } } } |
Seguidamente abrimos una consola y nos dirigimos a la carpeta recién creada para proceder a ejecutar:
Se va a trabajar con tres dependencias para efectos del proyecto:
- Los componentes de symfony.
- Las funcionalidades adicionales para los bundles (FrameworkExtraBundle).
- La librería DBAL de Doctrine (Database Abstraction Layer).
Archivos del proyecto
Debemos crear varios ficheros para poder ejecutar la aplicación, la estructura inicial de la que dispondremos es esta:
A continuación se describe el contenido de cada fichero:
app/AppKernel.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | <?php use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait; use Symfony\Component\Config\Loader\LoaderInterface; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\HttpKernel\Kernel; use Symfony\Component\Routing\RouteCollectionBuilder; use Doctrine\Common\Annotations\AnnotationRegistry; // require Composer's autoloader $loader = require __DIR__.'/../vendor/autoload.php'; // auto-load annotations AnnotationRegistry::registerLoader(array($loader, 'loadClass')); class AppKernel extends Kernel { use MicroKernelTrait; public function registerBundles() { /* Inicialmente vamos a trabajar con 3 bundles: * El Propio Framework, Twig * y Mejoras para controladores y demás. */ $bundles = array( new Symfony\Bundle\FrameworkBundle\FrameworkBundle(), new Symfony\Bundle\TwigBundle\TwigBundle(), new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(), ); return $bundles; } protected function configureContainer(ContainerBuilder $c, LoaderInterface $loader) { $loader->load(__DIR__.'/config/config.yml'); } protected function configureRoutes(RouteCollectionBuilder $routes) { // Cargamos los controllers usando anotaciones $routes->import(__DIR__.'/../src/App/Controller/', '/', 'annotation'); } } |
app/config/config.yml
1 2 3 4 5 | framework: secret: StringAleatorio # Cambiar esto templating: engines: ['twig'] profiler: { only_exceptions: false } |
web/index.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <?php use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Debug\Debug; require __DIR__.'/../app/AppKernel.php'; Debug::enable(); $kernel = new AppKernel('dev', true); $request = Request::createFromGlobals(); $response = $kernel->handle($request); $response->send(); $kernel->terminate($request, $response); |
src/App/Controller/HomeController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <?php namespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; class HomeController extends Controller { /** * @Route("/home") */ public function indexAction() { return $this->render('home/index.html.twig'); } } |
app/Resources/views/base.html.twig
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<!doctype html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Micro Foro - Symfony</title>
{% block stylesheets %}
<link rel="stylesheet" href="{{ asset('css/foro.css') }}">
{% endblock stylesheets %}
</head>
<body>
<header>
<div class="container">
<div class="header-title">
Symfony Micro-Foro
</div>
</div>
</header>
<article class="container">
<h1 class="page-header">{% block page_header %}{% endblock %}</h1>
<section class="content">
{% block content %}{% endblock %}
</section>
</article>
</body>
</html>
app/Resources/views/home/index.html.twig
1
2
3
4
5
{% extends 'base.html.twig' %}
{% block content %}
Hola Mundo!
{% endblock %}
web/css/foro.css
Listo!, con estos archivos ya podemos correr nuestra aplicación y verificar que todo funcione correctamente.
Ejecutando el proyecto:
Para ejecutar el proyecto vamos hacer uso del servidor interno de php. Para lo cual nos vamos a colocar en la raiz del proyecto desde la consola y vamos a ejecutar:
1 | php -S localhost:8000 -t web |
Si ahora vamos desde un navegador a http://localhost:8000/home
deberíamos tener como resultado:
Por ahora es todo! ya tenemos el proyecto configurado y funcionando con una página muy simple.
Descargar o visualizar el Proyecto
Para la segunda parte vamos a comenzar a crear la base de datos, los modelos y configurar algunos controladores