Utilizar Symfony 4 como si fuera Silex

octubre 23, 2018

Ya nos han avisado de que Silex ha muerto (https://symfony.com/blog/the-end-of-silex) pero como gran fan de este framework, aún me resistía a abandonarlo. Pero para nuevos proyectos en los que necesitamos la simplicidad de Silex, en lugar de buscar otra alternativa o framework, podemos hacer uso de Symfony 4 mediante su herramienta Flex para realizar prácticamente el mismo trabajo que hasta ahora con Silex.

En este artículo voy a explicar como configurar Symfony 4 mediante Flex para tener una instalación inicial de un proyecto en el que programaremos de forma similar a como lo hacíamos con Silex.

Creamos el proyecto mediante composer:

$ composer create-project symfony/skeleton:4.1.* miproyecto

Para este ejemplo, vamos a utilizar Twig y conexión con la base de datos. Por lo tanto, instalamos las librerías necesarias:

$ composer require twig
$ composer require symfony/orm-pack

Configuramos el VirtualHost de Apache para probar la web en local:

<VirtualHost *:80>
    DocumentRoot "/var/www/miproyecto/public"
    DirectoryIndex index.php
    ServerName miproyecto.test
    ServerAlias www.miproyecto.test
    <Directory "/var/www/miproyecto/public">
        AllowOverride All
        Allow from All
    </Directory>
</VirtualHost>

Si ahora abrimos el navegador y accedemos a la URL (http://miproyecto.test/) que acabamos de configurar, veremos que el proyecto funciona correctamente:

Para este primer proyecto de prueba, vamos a crear una tabla genérica en la base de datos y añadimos tres registros. Nos servirán para hacer pruebas después:

CREATE TABLE `testtable` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
INSERT INTO `testtable` (`id`, `title`) VALUES (1,'Título 1'), (2,'Título 2'), (3,'Título 3');

Configuramos la conexión con la base de datos en el archivo .env (línea 16):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# This file is a "template" of which env vars need to be defined for your application
# Copy this file to .env file for development, create environment variables when deploying to production
# https://symfony.com/doc/current/best_practices/configuration.html#infrastructure-related-configuration
 
###> symfony/framework-bundle ###
APP_ENV=dev
APP_SECRET=1313eb8ff3f07370fe1501a2fe57a7c7
#TRUSTED_PROXIES=127.0.0.1,127.0.0.2
#TRUSTED_HOSTS=localhost,example.com
###< symfony/framework-bundle ###
 
###> doctrine/doctrine-bundle ###
# Format described at http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url
# For an SQLite database, use: "sqlite:///%kernel.project_dir%/var/data.db"
# Configure your db driver and server_version in config/packages/doctrine.yaml
DATABASE_URL=mysql://db_user:db_password@127.0.0.1:3306/db_name
###< doctrine/doctrine-bundle ###

Ahora vamos a crear nuestro primer controlador.
Creamos el archivo /src/Controller/TestController.php y añadimos el siguiente código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
// src/Controller/TestController.php
namespace App\Controller;
use Doctrine\DBAL\Driver\Connection;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
 
class TestController extends AbstractController
{
    public function index(Connection $connection)
    {
        $rows = $connection->fetchAll('SELECT * FROM testtable');
        return $this->render('index.html.twig', [
            'rows' => $rows,
        ]);        
    }
}

Se parece bastante a lo que hubiéramos hecho en un proyecto Silex.
En la línea 12 realizamos la consulta a la base de datos tal y como lo haríamos en un proyecto Silex.
A continuación cargamos la plantilla que se encuentra en /templates/index.html.twig (la crearemos en el siguiente paso) y enviamos el resultado de la consulta.

Creamos la plantilla Twig que utilizaremos en este ejemplo. Creamos archivo index.html.twig dentro de la carpeta /templates:

{# /templates/index.html.twig #}
{% extends "base.html.twig" %}
 
{% block body %}
    <h1>Rows</h1>
    {% for row in rows %}
        {{ row.title }}<br />
    {% endfor %}
{% endblock %}

Ya solo nos queda el último paso, que consiste en configurar la ruta en la que cargaremos la funcionalidad que acabamos de crear.
En Silex lo hacíamos en el propio controlador, algo tal que así:

$app->get('/', function () use ($app) {
...
})->bind('homepage');

En Symfony 4 las rutas las configuramos en /config/routes.yaml.
Para este ejemplo, lo haremos así:

index:
    path: /
    controller: App\Controller\TestController::index

Ahora, si volvemos a acceder a la web veremos el resultado por pantalla:

Como añadido, vamos a instalar profiler para poder ver la barra de debug en la parte inferior mientras desarrollamos el proyecto.
Para ello, instalamos la librería correspondiente:

composer require profiler

Si accedemos de nuevo a la web, comprobaremos que la barra de debug no se muestra y aparece el mensaje “An error occurred while loading the web debug toolbar”. Esto es debido a que por defecto no se ha creado el fichero .htaccess en la carpeta /public

Para hacerlo de forma sencilla, podemos utilizar la siguiente receta que nos crea los archivos .htaccess necesarios para su correcto funcionamiento:

composer require symfony/apache-pack

Ahora sí, accedemos de nuevo a la web y se mostrará la debugbar correctamente.

En próximos artículos configuraremos otros temas como la seguridad y formularios.

Tags ; , ,

Escribe un comentario

Los comentarios son moderados y se utiliza rel="nofollow" para los enlaces.