Guerrero - Aplicación Web Desarrollada en PHP Usando El Framework Symfony
Guerrero - Aplicación Web Desarrollada en PHP Usando El Framework Symfony
2017-2018
2
Resumen
Desarrollar una aplicación web para la gestión de los registros de acceso en todas las sedes de
una empresa, utilizando el framework PHP Symfony.
La aplicación debe permitir al supervisor, listar de manera inmediata todos los presentes en un
local con el fin de evacuarlo en caso de emergencia.
Por otro lado, el administrador podrá acceder a la gestión de todos los empleados y sedes.
Además, el administrador tendrá la opción de listar los registros de todas las sedes, incluyendo un
filtrado por fecha.
3
Abstract
Develop a web application to manage every access record in all the headquarters of a company,
using the Symfony PHP framework.
Every company’s location will have available a computer to allow the employee to register
their entry or exit. The employee will have to enter his ID number and, subsequently, validate the
form.
The application must allow the supervisor to list, immediately, all employees present in a HQ,
in order to evacuate in case of emergency.
On the other hand, administrator can manage all employees and HQ. In addition, the
administrator will have the option to list the records of every site, including filtering by date.
4
8
Tabla de contenidos
Contenido
I. Introducción................................................................................................................................... 10
1 - Introducción ................................................................................................................................. 10
1.1 Motivación............................................................................................................................... 10
1.2 Motivación personal ................................................................................................................ 10
1.3 Objetivo ................................................................................................................................... 10
2 - Symfony ....................................................................................................................................... 11
2.1 Otros proyectos con Symfony ................................................................................................. 11
II. Especificación de requisitos .......................................................................................................... 16
1 - Introducción ................................................................................................................................. 16
1.1 Propósito.................................................................................................................................. 16
1.2 Alcance .................................................................................................................................... 16
1.3 Definiciones, siglas y abreviaturas .......................................................................................... 16
1.4 Referencias .............................................................................................................................. 17
1.5 Visión global ........................................................................................................................... 17
2 - Descripción general...................................................................................................................... 17
2.1 Perspectiva del producto.......................................................................................................... 17
2.2 Funciones del producto............................................................................................................ 17
2.3 Características de los usuarios ................................................................................................. 17
2.4 Restricciones ........................................................................................................................... 17
2.5 Suposiciones y dependencias .................................................................................................. 17
2.6 Requisitos futuros .................................................................................................................... 18
3 - Requisitos específicos .................................................................................................................. 18
3.1 Interfaces externas ................................................................................................................... 18
3.2 Funciones................................................................................................................................. 18
III. Análisis .......................................................................................................................................... 22
1 - Introducción ................................................................................................................................. 22
2 - Diagrama de clases....................................................................................................................... 22
3 - Diagramas de casos de uso........................................................................................................... 18
3.1 Caso base ................................................................................................................................. 18
3.2 Casos de Uso ........................................................................................................................... 22
4 - Diagramas de actividad ................................................................................................................ 23
4.1 Grabar registro ......................................................................................................................... 23
4.2 Realizar login administrador / supervisor................................................................................ 24
4.3 Alta usuario ............................................................................................................................. 25
4.4 Modificar o eliminar usuario ................................................................................................... 26
9
4.5 Alta sede .................................................................................................................................. 27
4.6 Modificar o eliminar sede........................................................................................................ 28
4.7 Listar registros desde supervisor ............................................................................................. 29
4.8 Listar registros desde administrador ........................................................................................ 30
IV. Diseño............................................................................................................................................ 31
1 - Introducción ................................................................................................................................. 31
2 - Patrón de diseño ........................................................................................................................... 31
2.1 Modelo..................................................................................................................................... 31
2.2 Vista ........................................................................................................................................ 31
2.3 Controlador.............................................................................................................................. 32
V. Implementación ............................................................................................................................. 33
1 - Entorno de desarrollo ................................................................................................................... 33
1.1 Apache y certificado SSL ........................................................................................................ 33
1.2 PHP 7.0.................................................................................................................................... 34
1.3 MYSQL y PHPMYADMIN .................................................................................................... 34
1.4 Configuración del proyecto ..................................................................................................... 34
2- Estructura Symfony....................................................................................................................... 35
3- Creación de entidades ................................................................................................................... 36
3.1 Introducción............................................................................................................................. 36
3.2 Creación de las entidades ........................................................................................................ 36
3.3 Carga del esquema en BBDD .................................................................................................. 42
3.4 Entity Manager ........................................................................................................................ 43
4- Bundles ......................................................................................................................................... 45
4.1- Creación de un nuevo Bundle ................................................................................................ 45
4.2- Activación de Bundles ........................................................................................................... 45
5- Rutas y controladores .................................................................................................................... 47
5.1- Definición de rutas y controladores ....................................................................................... 47
5.2- Utilización rutas para sedes.................................................................................................... 48
5.3- Configuración adicional ......................................................................................................... 50
6- Vistas............................................................................................................................................. 51
6.1- Bootstrap ............................................................................................................................. 51
6.2- Uso básico de las plantillas ................................................................................................. 52
6.3- Panel de administrador ........................................................................................................... 53
6.4- Panel de supervisor ................................................................................................................ 55
VI. Pruebas .......................................................................................................................................... 56
1.1- Pruebas de registro y login .................................................................................................. 56
1.2- Pruebas de carga de la aplicación........................................................................................ 57
1.3- Carga en dispositivos móviles............................................................................................. 58
VII. Conclusiones ................................................................................................................................. 60
1
0
VIII. Bibliografía.................................................................................................................................... 68
1
1
I. Introducción
1 - Introducción
Vamos a introducir las motivaciones principales por las que se ha elegido este
proyecto.
1.1 Motivación
La aplicación desarrollada parte de la necesidad de tener cuantificados todos
los empleados presentes dentro de cualquier ubicación de una empresa. Por
motivos de riesgos laborales, se considera necesario disponer, además, de una
utilidad que permita, en caso de evacuación, tener controlado que todos los
usuarios hayan abandonado las instalaciones y evitar así cualquier daño personal.
1.3 Objetivo
El principal objetivo es la implementación de un sistema de control presencial
que gestione las entradas y salidas del personal de la empresa en todas las
ubicaciones de la misma, basándose en Symfony[1].
- Procesador de textos.
10
2 - Symfony
Symfony dispone de diversas versiones en el mercado de las cuales hemos
elegido la 3.4 LTS dado que tiene soporte hasta noviembre de 2020 y además es
una versión de la que hemos encontrado mucha documentación. Actualmente, el
framework se encuentra en la versión 4.1 la cual supone un enorme cambio
respecto a la anterior, vamos a repasar los puntos más diferenciales:
- Drupal
- Laravel
- Joomla
- PHPBB
- Magento
- Composer
- PrestaShop
- CakePHP
- phpMyAdmin
- Doctrine
11
II. Especificación de requisitos
1 - Introducción
Para redactar esta ERS (Especificación de requisitos software) se ha seguido
el estándar IEEE-STD- 830-1998 [2].
1.1 Propósito
La finalidad de este proyecto es servir de sistema de control presencial para la
empresa cliente, para ello se pretende plasmar el funcionamiento actual de la
empresa y conseguir que la adaptación al software sea los más fácil y transparente
posible.
1.2 Alcance
El producto a desarrollar es un sistema de información (SI) que cubra las
necesidades de la empresa. La aplicación desarrollada se llamará
ControlPresencial usando una programación orientada a objetos, en PHP y
utilizando el framework Symfony.
Además, en cada sede existirá un supervisor el cual podrá sacar un listado del
personal que esté en ese momento dentro de las instalaciones.
16
1.4 Referencias
-IEEE-STD-830-1998
-Wikipedia
- https://www.fdi.ucm.es/profesor/gmendez/docs/is0809/ieee830.pdf
- Libro Desarrollo web ágil con Symfony2 de Javier Eguiluz
2 - Descripción general
2.1 Perspectiva del producto
Esta aplicación es completamente independiente, por lo que no guarda
relación con cualquier otro elemento software ya disponible en la empresa.
2.4 Restricciones
17
del servidor de desarrollo. Con esto se garantiza la correcta puesta en marcha de
la aplicación, para futuras actualizaciones, sería conveniente revisar el desarrollo
para evitar problemas de funcionamiento.
3 - Requisitos específicos
3.1 Interfaces externas
3.2 Funciones
A continuación, procedemos a especificar las acciones que va a llevar a cabo
nuestra aplicación.
18
3.2.2 Realizar login administrador/supervisor
Esta función consiste en acceder al panel de administrador o supervisor,
mediante el formulario de login.
19
3.2.6 Modifica o eliminar usuario
Tras la búsqueda de un usuario podemos editarlo o eliminarlo:
Acción Repercusión en la base de datos
Pinchar en Buscar usuario
Buscamos el usuario por DNI, Nombre,
Apellidos o tipo
Pinchar en buscar Consultar en BBDD por el filtro seleccionado
Correcto: Mostrar usuario
Error: Indicamos al usuario que ha habido un
error.
Redirigir al panel de edición de usuario o al
panel principal.
En el panel de edición modificamos los Realizamos la modificación en BBDD.
campos necesarios y damos a actualizar o
eliminar.
3.2.7 Alta sede
Esta tarea consiste en la generación de una nueva sede, desde el panel de
administración:
Acción Repercusión en la base de datos
Pinchar en Administrar sedes
Pinchar en Alta sede
Introducimos los valores solicitados Consultar en BBDD que no existe la misma
sede
Correcto: Generar sede
Error: Indicamos al usuario que ha habido un
error.
Redirigir al panel de administración.
2
0
3.2.10 Listar registros desde administrador
Desde el panel de administrador, se pueden listar los registros, filtrando por
sede y fecha.
Acción Repercusión en la base de datos
Vamos al panel de administrador
Pinchamos en Listar registros
Elegimos los filtros y le damos a Listar Se consulta en BBDD los registros que
cumplen los filtros.
21
III. Análisis
1 - Introducción
Vamos a proceder al análisis de la aplicación para lo que vamos a emplear los
diagramas necesarios que faciliten la labor posterior de diseño.
2 - Diagrama de clases
El diagrama de clases propuesto para la aplicación es el siguiente:
22
3 - Diagramas de casos de uso
El diagrama de casos de uso muestra los posibles escenarios que tienen los
usuarios de la aplicación y las tareas que pueden realizar.
).
18
3.2 Casos de Uso
22
4 - Diagramas de actividad
A continuación, vamos a utilizar diagramas de actividad para definir las
interacciones más complejas dentro de la aplicación.
23
4.2 Realizar login administrador / supervisor
24
4.3 Alta usuario
25
4.4 Modificar o eliminar usuario
El administrador desde el panel busca un usuario, rellena el formulario con los datos
pertinentes y, si encontramos el usuario le permitimos la edición del mismo. Al finalizar,
se intentan guardar los cambios, si el cambio es correcto se redirige al panel.
26
4.5 Alta sede
27
4.6 Modificar o eliminar sede
El administrador desde el panel elige una sede para editar al finalizar, se intentan
guardar los cambios, si el cambio es correcto se redirige al panel.
28
4.7 Listar registros desde supervisor
El supervisor, tras el login, elige la opción para listar usuarios, seleccionamos la sede
asociada al supervisor y se le muestran los registros de la misma.
29
4.8 Listar registros desde administrador
30
IV. Diseño
1 - Introducción
El diseño de esta aplicación ha seguido, como hemos comentado
anteriormente, el patrón Modelo Vista Controlador. Dicho patrón separa la
interfaz del usuario, la lógica de negocio y los datos de la propia aplicación.
Podemos ver en el siguiente gráfico una representación del modelo:
2 - Patrón de diseño
2.1 Modelo
Esta capa es la encargada de proporcionar la persistencia de la información,
en el modelo MVC. En Symfony las aplicaciones definen el modelo en base a las
clases creadas, las cuales de traducen en tablas en la propia BBDD. Para dicha
tarea utilizamos el ORM Doctrine, mediante el cual generamos la estructura de
la BBDD de nuestra aplicación.
En nuestra aplicación las clases contenidas en esta capa son:
2.2 Vista
La capa de vista, también conocida como presentación, es la interfaz que
utilizará el usuario para interactuar con el sistema. Es decir, es la parte visual de
nuestra aplicación donde presentamos los menús y las opciones para permitir a
los usuarios utilizar la aplicación.
31
2.3 Controlador
El controlador es el encargado de atender los eventos producidos en el sistema,
realiza peticiones a la capa modelo para consultar datos y pasando la información
necesaria para que la capa de presentación pueda presentarlos.
logincheck:
path: /logincheck
return $this->render('default/logincheck.html.twig', [
]);}
32
V. Implementación
1 - Entorno de desarrollo
Partimos de una instalación limpia de Ubuntu 16.04 LTS, actualizada con los
últimos parches de seguridad de la distribución. Necesitaremos pues configurar
apache [6], mysql y php en nuestro servidor.
$openssl req -x509 -nodes -newkey rsa:2048 -keyout tfg.local.key -out tfg.crt
$a2enmod rewrite
$a2enmod ssl
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
<VirtualHost *:80>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>
33
1.2 PHP 7.0
Instalamos php y composer [7]:
$apt-get install -y php7.0 libapache2-mod-php7.0 php7.0-cli php7.0-common php7.0-mbstring
php7.0-gd php7.0-intl php7.0-xml php7.0-mysql php7.0-mcrypt php7.0-zip composer
$a2ensite tfg.local.conf
34
2- Estructura Symfony
La estructura de directorios de Symfony varía en función al tipo de proyecto
que hayamos creado, framework-standard-edition, website-skeleton,… En
nuestro caso, tenemos la siguiente estructura:
tfg
├─ app/
│ ├─ config/
│ └─ Resources/
├─ bin/
│ └─ console
├─ src/
│ └─ AppBundle/
├─ tests/
│ └─ AppBundle/
├─ var/
│ ├─ cache/
│ ├─ logs/
│ └─ sessions/
├─ vendor/
└─ web/
├─ app.php
35
3- Creación de entidades
3.1 Introducción
En base al diagrama de clases definido en la fase de análisis, tenemos que
crear la estructura adecuada de datos para dar soporte a nuestra aplicación. En
Symfony, como en otras herramientas de programación, definiremos las
entidades y sus relaciones para, posteriormente, “traducirlo” a bases de datos.
En este proceso necesitaremos utilizar el ORM Doctrine mediante el cual
Symfony mapea como objetos de la aplicación las tablas que componen la base
de datos.
Procedamos a crear la BBDD mediante el comando:
php bin/console doctrine:database:create
Instead of starting with a blank entity, you can add some fields now.
Note that the primary key will be added automatically (named id).
Is nullable [false]:
Unique [false]:
36
Field type [string]:
Is nullable [false]:
Unique [false]:
Is nullable [false]:
Is nullable [false]:
Unique [false]:
Entity generation
created ./src/AppBundle/Entity/Persona.php
namespace AppBundle\Entity;
/**
* Persona
*
* @ORM\Table(name="persona")
* @ORM\Entity(repositoryClass="AppBundle\Repository\PersonaRepository")
*/
class Persona
{
/**
* @var int
*
37
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="nombre", type="string", length=255)
*/
private $nombre;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set nombre
*
* @param string $nombre
* @return Persona
*/
public function setNombre($nombre)
{
$this->nombre = $nombre;
return $this;
}
/**
* Get nombre
*
* @return string
*/
public function getNombre()
{
return $this->nombre;
}
….
38
Creación directa de entidades
La otra opción que tenemos para generar las entidades, pasa por crear
directamente nuestros archivos php con las clases necesarias. Es una opción más
“peligrosa” puesto que debemos recordar implementar todos los métodos para
acceder o modificar los atributos de la clase, en cambio, nos permite abordar
directamente la definición de las relaciones entre clases:
- Uno a muchos / muchos a uno: Esta es la única relación representada en nuestro
diagrama de clases. Por ejemplo, un objeto persona puede estar asociado a
muchos objetos registro, sin embargo, un objeto registro solo puede estar
asociado a un objeto persona.
- Muchos a muchos: Esta relación permite la asociación de muchos objetos X
con muchos objetos Y. En nuestro caso, no tenemos dicha relación.
Vamos a proceder a generar las entidades Sede y Registro mediante la
creación directa de los archivos php, que ubicaremos dentro de
src/AppBundle/Entity/:
src/AppBundle/Entity/Sede.php
<?php
namespace AppBundle\Entity;
/**
* @ORM\Entity
*/
class Sede
{
/**
* @ORM\Id;
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(type="string", length=20)
*/
protected $nombre;
/**
* @ORM\Column(type="string", length=200)
*/
protected $calle;
/**
* @ORM\Column(type="string", length=50)
**/
protected $ciudad;
39
public function setNombre($nombre)
{
$this->nombre = $nombre;
}
src/AppBundle/Entity/Registro.php
<?php
namespace AppBundle\Entity;
/**
* @ORM\Entity
*/
class Registro
{
/**
* @ORM\Id;
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(type="date")
*/
protected $fecha;
/**
40
* @ORM\Column(type="boolean")
*/
protected $tipo;
/**
* @ORM\ManyToOne(targetEntity="Persona")
**/
protected $persona;
/**
* @ORM\ManyToOne(targetEntity="Sede")
**/
protected $sede;
41
Dentro de estas dos clases, podemos observar cómo se definen las relaciones
muchos-a-uno entre Registro-Persona y Registro-Sede.
42
3.4 Entity Manager
El entity manager de Doctrine nos servirá para realizar todas las operaciones
que necesitemos sobre los datos de nuestra aplicación. Tenemos que tener en
cuenta que, para el correcto funcionamiento de la aplicación, debemos de persistir
el dato. Para ello utilizamos la función persist() como vamos a ver en los
siguientes ejemplos de código:
Creación de nuevo elemento
En este código, generamos una nueva persona y guardamos los datos en
nuestra BBDD:
$persona= new Persona();
$persona->setNombre(‘Ramon’);
$persona->setApellidos(‘Guerrero Oriola’);
$persona->setDni(‘00000000X’);
$em=$this->getDoctrine()->getEntityManager();
$em->persist($persona);
$em->flush();
43
Modificación de un elemento
Este código es muy similar a la creación de un elemento pero, en lugar de
partir de una entidad vacía, recuperamos una ya existente:
$em=$this->getDoctrine()->getEntityManager();
$persona=$em->getRepository(‘AppBundle:Persona’)->
findOneBy(array('dni'=>’00X’));
$persona->setNombre(‘Ramon’);
$em->persist($persona);
$em->flush();
Eliminación de un elemento
Aquí recuperamos un elemento y lo eliminamos:
$em=$this->getDoctrine()->getEntityManager();
$persona=$em->getRepository(‘AppBundle:Persona’)->
findOneBy(array('dni'=>’00X’));
$em->remove($persona);
$em->flush();
A diferencia de los ejemplos anteriores, en este caso la eliminación de un
elemento no llama al método persist() sino a remove().
Búsqueda de elemento(s)
En los códigos anterior, modificación y borrado, se utiliza un tipo de
búsqueda. No obstante, el entity manager dispone de más métodos: find(),
findAll(), findBy() y findOneBy(). Los métodos con By utilizan una propiedad de
la entidad para la búsqueda.
En nuestro código, necesitaremos además realizar búsquedas que implican
varias entidades. Una de las principales, y motivo del desarrollo de la aplicación,
es la búsqueda de los registros de una sede, En el siguiente ejemplo, buscamos
todos los registros de la sede de Valencia:
$registros=$em->getRepository(‘AppBundle:Registro’)->findBy(array(
‘sede’=>$sede->getId(),
‘ciudad’=>’Valencia’
));
44
4- Bundles
El código de una aplicación Symfony se estructura en bundles. Los bundles
son directorios que contienen archivos de código en una estrcutura con forma
jerarquizada. Contienen clases PHP mayoritariamente, aunque también pueden
contener archivos css, javascript e imágenes.
En nuestro caso, hemos utilizado el propio AppBundle que se genera
automáticamente al importar el esqueleto del proyecto Symfony estándar. No
obstante, vamos a ver la creación y activación de un bundle.
45
updated ./app/config/routing.yml
OK
FOSUserBundle
Este Bundle nos provee de todo lo necesario para el registro y login de
usuarios, además del reseteo de contraseña y una página de perfil dentro de una
aplicación.
Para su instalación, nos sirve con añadir el bundle con composer:
…
class AppKernel extends Kernel
{
public function registerBundles()
{
$bundles = [
new FOS\UserBundle\FOSUserBundle(),
…
];
46
5- Rutas y controladores
El sistema de enrutamiento dirige las URL al controlador correspondiente para
la ejecución del código conveniente. El archivo principal donde definimos el
routing es app/config/routing.yml aunque, en caso de que el número de rutas sea
muy elevado, podemos utilizar rutas dentro de los bundles.
Por otro lado, durante el desarrollo de la aplicación hemos necesitado añadir
controladores que manejen la funcionalidad necesaria. Estos controladores los
encontramos dentro del propio Bundle de la aplicación.
portada:
path: /portada
defaults: { _controller: AppBundle:Portada:portada }
<?php
namespace AppBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
return $this->render('default/index.html.twig', [
'base_dir' => realpath($this-
>getParameter('kernel.project_dir')).DIRECTORY_SEPARATOR,
]);
}
}
47
Cuando el proyecto va tomando cuerpo y ampliamos las rutas disponibles en
el mismo, tenemos la opción de comprobar desde el debugger las rutas definidas.
Para ellos utilizamos el siguiente comando:
portadaCiudad:
path: /portada/{ciudad}
defaults: { _controller: AppBundle:Portada:portadaCiudad }
48
De esta manera, cuando un usuario introduce su registro tenemos la sede
donde ha registrado su presencia para poder guardarla. El formulario utilizado
para el guardado del registro realiza el grabado en BBDD (tras la comprobación
de la existencia del usuario) con el siguiente fragmento de código:
…
if ($request->isMethod('POST')) {
$form->handleRequest($request);
if($form->isValid()){
$formu=$form->getData();
$persona = new Persona;
$persona = $this->getDoctrine()->getRepository(Persona::class)-
>findOneBy(array('dni'=>$formu["DNI"]));
if(empty($persona)){
echo '<script language="javascript">';
echo 'alert("Error en el DNI introducido")';
echo '</script>';
} else{
$preg1 = $this->getDoctrine()->getRepository(Registro::class)-
>findOneBy(array('persona'=>$persona),array('id'=>'DESC'));
$ec=$preg1->getTipo();
$dt = new \DateTime("now");
$registro=new Registro;
$registro->setFecha($dt);
if($ec){
$registro->setTipo(false);
}else{
$registro->setTipo(true);
}
$registro->setSede($sede);
$registro->setPersona($persona);
$em->persist($registro);
$em->flush(); }
….
49
5.3- Configuración adicional
Barra al final de las URL
Uno de los problemas que nos podemos encontrar viene con la barra al final
de las URL. Por ejemplo, en el ejemplo anterior si buscamos la URL /portada/
obtendremos un error:
No route found for “GET /portada/”
Para evitar este problema, podemos optar por la solución más sencilla, definir
las rutas con la barra al final:
portada:
path: /portada/
defaults: { _controller: AppBundle:Portada:portada }
Añadiendo la barra final en nuestras rutas evitamos este error, por otro lado,
cuando buscamos la URL sin barra Symfony lo enlaza con la ruta correcta
(añadiendo la barra).
50
6- Vistas
En Symfony, para las vistas, se utilizan plantillas TWIG mediante las cuales
se establecen los parámetros globales de presentación de nuestra aplicación. En
la mayoría de aplicaciones web se utiliza diferentes niveles para las plantillas.
Por ejemplo:
6.1- Bootstrap
Bootstrap es un conjuntor de librerías que contiene plantillas de diseño con
tipografía, formularios, botones, cuadros… En nuestro caso, hemos integrado
dichas librerías en nuestro proyecto.
Para la integración hemos creado los directorios css y js dentro del directorio
web. A partir de ese momento, ya podemos invocar las librerías bootstrap desde
cualquiera de nuestras plantillas.
Por ejemplo, en el archivo base.html.twig:
51
Al siguiente aspecto:
{% extends 'base.html.twig' %}
{% block stylesheets %}
52
6.3- Panel de administrador
El panel de administrador, con las utilidades necesarias para el mismo, tiene
la siguiente presentación:
53
Administrar las sedes:
Estas son parte de las tareas que puede llevar a cabo el administrador del
sistema mediante su panel.
54
6.4- Panel de supervisor
En cambio, el panel del supervisor es mucho más simple, dado que sólo se le
permite listar los usuarios que, actualmente, estén en el interior de su sede
asociada.
Desde esta ventana tenemos la opción de Listar para sacar el propio listado,
anteriormente comentado:
55
VI. Pruebas
Hemos realizado pruebas y test funcionales para comprobar el
funcionamiento y manejo de nuestra app. Mediante estos test se revisa que la
aplicación hace correctamente lo que debe, sin errores y en tiempos de carga
apropiados.
56
Esto nos lleva al panel de login, aquí introducimos el usuario y la contraseña
y validamos:
57
Hemos de tener en cuenta que nuestra base de datos contiene 50 registros de
usuario, a medida que la aplicación funcione y esta carga sea mayor, podríamos
notar peor rendimiento en la prueba “Carga listado administrador”.
Por otro lado, la principal mejora que nos sugiere PageSpeed para mejorar la
carga de la página, es habilitar la compresión de los recuersos css, js,... Esto nos
implica una reducción del 81% en el peso de los ficheros implicados.
Tablet:
58
Smartphone:
59
VII. Conclusiones
Por último, vamos a exponer las conclusiones acerca de lo que ha supuesto el
desarrollo del proyecto.
En primer lugar, me gustaría destacar que la mayor parte del tiempo dedicado
a este proyecto la he empleado en el aprendizaje de Symfony, aunque parezca
obvio. Es un framework conocido y con una gran comunidad, pero es cierto que
los primeros pasos con el mismo pueden ser aturdidores. Entender los conceptos
de rutas, bundles o empezar a interactuar con archivos TWIG y YAML con los
que no tenía ninguna experiencia previa, ha sido un reto para mí.
En cuanto al desarrollo de la aplicación en sí, una vez entendida la
funcionalidad que aporta Doctrine y con la gran ayuda de la comunidad que
utiliza PHP he podido llegar a desarrollar lo que pretendía. En más de una ocasión
me he encontrado revisando el panel de Symfony, los logs… para intentar
averiguar que estaba pasando en ese momento para que la aplicación no
funcionase como deseaba.
Esta aplicación puede mejorarse integrando el control de horarios, un aspecto
mucho más común en cualquier empresa que la gestión del personal presente en
la misma. Como comentamos en esta memoria anteriormente, sería posible
realizar la mejora integrando un calendario y dotando de mayor funcionalidad al
módulo de administración.
Finalmente, quisiera comentar que me queda la sensación que Symfony, es
una herramienta muy potente y con la cual se pueden desarrollar aplicaciones de
mucha mayor envergadura.
60
VIII. Bibliografía
Vamos a hacer referencia a la documentación consultada para el desarrollo
del proyecto:
[1] Libro Desarrollo web ágil con Symfony2 de Javier Eguiluz.
68