Introducción a silex

Silex es un micro framework de PHP basado en Symfony, permite simplificar y disminuir el tiempo de desarrollo de aplicaciones robustas y seguras.

Las aplicaciones desarrolladas en Silex siguen el patrón de desarrollo MVC (Modelo-Vista-Controlador). En este articulo voy a mostrarte un ejemplo con el que puedes introducirte en el desarrollo de aplicaciones basadas en Silex

Instalación de Silex

Para instalar Silex necesitas hacer uso de Composer, si aun o lo tienes, puedes instalarlo desde este enlace, también vas a necesitar un servidor web con al menos PHP, Apache (o Nginx) y MySQL (u otra base de datos), si no tienes esto, puedes instalar WAMP, aquí hay un articulo que explica como hacerlo.

Ahora que ya tienes todos los requisitos, puedes abrir una ventana de comandos (Símbolo del Sistema si usas Windows ) y navegas hasta la ruta de tu servidor web por ejemplo «c:\wamp64\www» y ejecutas este comando:

composer create-project fabpot/silex-skeleton nombre_aplicacion «~2.0»

En el comando anterior solo tienes que cambiar «nombre_aplicacion» por el nombre de tu aplicación, esto creará una carpeta en el directorio en el que te encuentras, con ese nombre de aplicación y dentro de ella todo el código necesario para tu aplicación basada en Silex.

Ahora para probar solo tienes que abrir en tu navegador esta dirección (no olvides cambiar el nombre de la aplicación):

http://localhost/nombre_aplicacion/web/index_dev.php

Si todo esta bien, veras algo como esto

Primer programa de silex

Trabajando con rutas

Ahora vamos a agregar una ruta y un controlador, primero vamos a crear un archivo llamado productos.php en esta ruta: src/controladores/productos.php

<?php
# src/controllers/tareas.php
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

$productos = $app['controllers_factory'];

/*
Así se define una ruta simple
 */
$productos->get('/', function (Request $request) use($app){
  return "Mostrar aqui un listado de productos";
})->bind('prod_inicio');

/*
Asi se definie una ruta, que recibe un parametro y se convierte en variable {id}
 */
$productos->get('/{id}', function (Request $request, $id) use($app){
  return "Mostrar el producto con id: ". $id;
})->bind('prod_ver');

//Al final regresamos el objeto productos
return $productos;
?>

Ahora debemos montar este controlador, esto lo hacemos en el archivo src/app.php, noten que este archivo ya existe, solo agregamos esta línea: $app->mount(‘/productos’, include ‘controladores/productos.php’);

<?php

use Silex\Application;
use Silex\Provider\AssetServiceProvider;
use Silex\Provider\TwigServiceProvider;
use Silex\Provider\ServiceControllerServiceProvider;
use Silex\Provider\HttpFragmentServiceProvider;

$app = new Application();
$app->register(new ServiceControllerServiceProvider());
$app->register(new AssetServiceProvider());
$app->register(new TwigServiceProvider());
$app->register(new HttpFragmentServiceProvider());
$app['twig'] = $app->extend('twig', function ($twig, $app) {
    // add custom globals, filters, tags, ...

    return $twig;
});

// Montar el controlador y rutas para manejar tareas
$app->mount('/productos', include 'controladores/productos.php');

return $app;

Ahora si, ya tenemos nuestro primer controlador, para verlo podemos ingresar a estas dos rutas:

http://localhost/nombre_aplicacion/web/index_dev.php/productos/

http://localhost/nombre_aplicacion/web/index_dev.php/productos/2

Trabajando con modelos

Ahora vamos a trabajar la parte del modelo, esto se hace con una base de datos, en este caso será MySQL y la librería de Doctrine, sino sabes que es Doctrine, puedes obtener más información en este enlace.

Ahora crea una base de datos, con nombre silex y una tabla llamada productos con dos campos, como se ve en esta imagen:

Tabla productos

Ahora para trabajar con doctrine debemos instalar la librería corriendo este comando en una ventana de comandos y debemos estar en la ruta de la aplicación, por ejemplo c:\wamp64\www\nombre_aplicacion

composer require «doctrine/dbal:~2.2»

Ahora debemos registrar los datos de conexión en la base de datos, esto lo hacemos en el archivo src/app.php agregando este código

//Registrar la base de datos
$app->register(new Silex\Provider\DoctrineServiceProvider(), array(
‘db.options’ => array(
‘dbname’ => ‘silex’, //Base de datos
‘host’ => ‘localhost’, //Servidor en donde esta la base de datos
‘user’ => ‘root’, //Usuario de la base de datos
‘password’ => ”, //Clave
),
));

El archivo src/app.php quedará de esta forma:

<?php

use Silex\Application;
use Silex\Provider\AssetServiceProvider;
use Silex\Provider\TwigServiceProvider;
use Silex\Provider\ServiceControllerServiceProvider;
use Silex\Provider\HttpFragmentServiceProvider;

$app = new Application();
$app->register(new ServiceControllerServiceProvider());
$app->register(new AssetServiceProvider());
$app->register(new TwigServiceProvider());
$app->register(new HttpFragmentServiceProvider());
$app['twig'] = $app->extend('twig', function ($twig, $app) {
    // add custom globals, filters, tags, ...

    return $twig;
});

//Registrar la base de datos
$app->register(new Silex\Provider\DoctrineServiceProvider(), array(
    'db.options' => array(
        'dbname'   => 'silex', //Base de datos
        'host'     => 'localhost', //Servidor en donde esta la base de datos
        'user'     => 'root', //Usuario de la base de datos
        'password' => '', //Clave
    ),
));

// Montar el controlador y rutas para manejar tareas
$app->mount('/productos', include 'controladores/productos.php');

return $app;

Ahora vamos a modificar uno de los controladores, para que muestre la información, según la base de datos:

<?php
# src/controllers/tareas.php
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

$productos = $app['controllers_factory'];

/*
Asi se definie una ruta simple
 */
$productos->get('/', function (Request $request) use($app){
  return "Mostrar aqui un listado de productos";
})->bind('prod_inicio');

/*
Asi se definie una ruta, que recibe un parametro y se convierte en variable {id}
 */
$productos->get('/{id}', function (Request $request, $id) use($app){
  $sql = "select * from productos where id = ?";
  $prod = $app['db']->fetchAssoc($sql, array($id));
  return $prod['descripcion'];
})->bind('prod_ver');

//Al final regresamos el objeto productos
return $productos;
?>

Ahora si probamos esta ruta, vamos a ver el nombre del producto que corresponde al id, que se envía en la ruta

Trabajando con plantillas (twig)

Muy bien ya tienes tu controlador y el modelo, ahora vamos a utilizar twig para mostrar la lista de productos. Si necesitas más información sobre twig, puedes consultar este enlace.

Primero vamos a crear un archivo de plantilla en esta ruta templates\productos\index.html.twig

{% extends "layout.html.twig" %}
{% block content %}

<h1>Productos</h1>
<ul>
    {% for producto in productos %}
        <li>
          {{ producto.descripcion }}
        </li>
    {% endfor %}
</ul>

{% endblock %}

En el código anterior en la línea 1, estamos diciendo que esta plantilla se hereda de la plantilla layout.html.twig, que ya viene definida en silex (está en la carpeta templates), luego en la línea 2, decimos que vamos a sobreescribir el bloque content (definido en la plantilla layout.html.twig) que se cierra en la última línea (13).

Luego utilizamos un ciclo for para recorrer la variable productos que es un array, noten que cuando se coloca una variable de twig entre llaves dobles (linea 8), equivale a un echo o print de php

Ahora también tenemos que modificar el controlador para enviarle la información a la plantilla.

<?php
# src/controllers/tareas.php
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

$productos = $app['controllers_factory'];

/*
Asi se definie una ruta simple
 */
$productos->get('/', function (Request $request) use($app){
  $sql = "SELECT * FROM productos";
  $data = $app['db']->fetchAll($sql);
  return $app['twig']->render('productos/index.html.twig', array('productos'=>$data));
})->bind('prod_inicio');

/*
Asi se definie una ruta, que recibe un parametro y se convierte en variable {id}
 */
$productos->get('/{id}', function (Request $request, $id) use($app){
  $sql = "select * from productos where id = ?";
  $prod = $app['db']->fetchAssoc($sql, array($id));
  return $prod['descripcion'];
})->bind('prod_ver');

//Al final regresamos el objeto productos
return $productos;
?>

En el código anterior en la linea 14 estamos enviando la plantilla con el método render, este necesita dos parámetros, el primero es la ruta de la plantilla y el segundo es un array con los parámetros y valores que necesita la plantilla.

Ahora para probar los cambios podemos ingresar en esta ruta

http://localhost/nombre_aplicacion/web/index_dev.php/productos/

Conclusión

Silex es un framework bastante sólido y permite desarrollar aplicaciones seguras para cualquier tamaño de empresa, y lo mejor es, que es mucho más fácil de aprender que Symfony.

Ahora ya tienes una idea de cómo se trabaja con Silex, si estas interesado en aprender más, puedes consultar la documentación oficial.

Si al probar esto tuviste algún problema, puedes descargar todo el código de este ejemplo, solo tienes que crear la base de datos y copiar esto en la carpeta www de tu wamp.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *