Desarrollo web Symfony2 parte 2

De WikiSalud
Saltar a: navegación, buscar

Véase Desarrollo_web_Symfony2

Contenido

Estructura de carpetas de Symfony2

Symfony posee una estructura de carpetas como se muestra a continuación:

hr
├── app
│   ├── AppCache.php
│   ├── AppKernel.php
│   ├── autoload.php
│   ├── bootstrap.php.cache
│   ├── cache
│   ├── check.php
│   ├── config
│   │   ├── config_dev.yml
│   │   ├── config_prod.yml
│   │   ├── config_test.yml
│   │   ├── config.yml
│   │   ├── parameters.yml
│   │   ├── routing_dev.yml
│   │   ├── routing.yml
│   │   └── security.yml
│   ├── console
│   └── logs
├── src
│   └── Acme
│       └── DemoBundle
│           ├── AcmeDemoBundle.php
│           ├── Controller
│           ├── Entity
│           ├── Form
│           ├── Resources
│           │   ├── config
│           │   │   └── services.xml
│           │   ├── public
│           │   │   ├── css
│           │   │   ├── js
│           │   │   └── images
│           │   └── views
│           │       ├── Demo
├── vendor
....
└── web
    ├── app_dev.php
    ├── apple-touch-icon.png
    ├── app.php
    ├── bundles
    │   ├── acmedemo
    │   │   ├── css
    │   │   ├── js
    │   │   └── images
    ├── config.php
    ├── favicon.ico
    └── robots.txt

Directorio app

La finalidad de este directorio es alojar a los archivos PHP encargados de los procesos de carga del Framework y a toda la configuración general de la aplicación. Los archivos de este directorio son los encargados de unir y dar cohesión a los distintos componentes del Framework.

├── app
│   ├── AppCache.php
│   ├── AppKernel.php
│   ├── autoload.php
│   ├── bootstrap.php.cache
│   ├── cache
│   ├── check.php
│   ├── config
│   │   ├── config_dev.yml
│   │   ├── config_prod.yml
│   │   ├── config_test.yml
│   │   ├── config.yml
│   │   ├── parameters.yml
│   │   ├── routing_dev.yml
│   │   ├── routing.yml
│   │   └── security.yml
│   ├── console
│   └── logs
  • autoload.php: mapea los espacios de nombres contra los directorios en los que residirán las clases pertenecientes a dichos espacios de nombre. De esa manera el proceso de autocarga de clases sabrá donde tiene que buscar las clases cuando se usen dichos espacios, sin necesidad de incluir explícitamente los archivos donde se definen las clases.
  • AppKernel.php: se declaran los bundles que se utilizarán en la aplicación. Como se explicará mas adelante, esta opción la realiza Symfony desde una instrucción desde consola.
  • config/: este directorio contiene todos los archivos de configuración del Framework. Algunos de los archivos son los que se describen a continuación.
    • config.yml: contiene la configuración general del Framework.
    • parameters.yml: contiene los parámetros de configuración de la base de datos.
    • routing.yml: contiene las rutas globales de los Bundles (este término se explicará a detalle más adelante) que contiene la aplicación.
    • routing_dev.yml:contiene las rutas globales de la aplicación como quien es raíz , la pagina de configuración, las paginas de ejemplos, entre otras.
    • security.yml:contiene las configuraciones necesarias para la seguridad de Symfony.
  • cache/ y logs/: Para acelerar la ejecución de los scripts, la configuración, el enrutamiento y las plantillas de twig son compiladas y almacenadas dentro del directorio cache/. En el directorio logs se almacenan los errores y otra información de interés acerca de eventos que ocurren cuando se ejecuta el framework.
  • console: esta es una aplicación que se ejecuta desde consola. Al ejecutarse sin parámetros se muestran todas las opciones disponibles para esta aplicación. Escribir en consola como usuario normal:
php app/console

Aparecerá algo parecido a lo siguiente:

Symfony version 2.1.3 - app/dev/debug
 
Usage:
  [options] command [arguments]
 
Options:
  --help           -h Display this help message.
  --quiet          -q Do not output any message.
  --verbose        -v Increase verbosity of messages.
  --version        -V Display this application version.
  --ansi              Force ANSI output.
  --no-ansi           Disable ANSI output.
  --no-interaction -n Do not ask any interactive question.
  --shell          -s Launch the shell.
  --process-isolation    Launch commands from shell as a separate processes.
  --env            -e The Environment name.
  --no-debug          Switches off debug mode.
 
Available commands:
......

Directorio src

Este directorio contiene todo el código creado por el desarrollador para la aplicación.

└── src
    └── Carpeta_Contenedora
        └── nombreBundle
            ├── Carpeta_ContenedoraNombreBundle.php
            ├── Controller
            │   └── nombrecontroladorController.php
            ├── Entity
            ├── Form
            └── Resources
                ├── config
                │   └── services.xml
                ├── public
                │   ├── css
                │   ├── js
                │   └── images
                └── views
                    └── Carpeta_Vistas
                        └── nombreVista.html.twig


Carpeta_Contenedora: debe nombrarse ya sea con el nombre de la institución o con el nombre del sistema ya que ella contendrá todos los Bundles que conformarán la aplicación.

  • nombreBundle/: este directorio es un Bundle. Siempre debe ir acompañado de la palabra Bundle luego del nombre.
  • Controller/: este directorio contendrá todos los controladores de ese bundle. Todos los controladores debe contener la palabra controller en el nombre de la clase.
  • Entity/: este directorio contendrá todas las entidades que son la representación de las tablas a nivel de objetos. Estas clases estarán conformadas por los campos de las tablas que serán los atributos de las clases y los métodos setter y getter.
  • Form/: este directorio contendrá los formularios realizados con Symfony.
  • Resorces/:este directorio contiene las configuraciones propias de cada bundle, en ese directorio se podrá guardar un rounting.yml propio para el bundle. En el directorio public estarán todos los issett que luego se harán público en la carpeta web. Y finalmente el directorio views contendrá todas las vistas que se necesiten en los controladores, estas pueden estar dentro de una carpeta contenedora o directamente sobre este directorio.

Directorio vendor

Este directorio contendrá todo aquel código que no pertenece al desarrollador de la aplicación; es lo que se conoce como librerías de terceros. También contiene los componentes de Symfony2, el ORM Doctrine2 y el sistema de plantillas twig.

Directorio web

Este directorio contiene el controlador frontal (app_dev.php y app.php) y todos los Assets de la aplicación: CSS's, Javascripts, imágenes, etc.

 └── web
    ├── app_dev.php
    ├── app.php
    ├── bundles
    │   ├── nombreBundle
    │   │   ├── css
    │   │   ├── js
    │   │   └── images
    └── config.php
  • app.php : es el controlador frontal de la aplicación, es decir, es el el que decide hacia donde deben ir las peticiones según los parámetros que esta posea. Un conjunto de parámetros determinado se denomina ruta. Por ejemplo:
 http://hr.localhost/app.php/articulo/1

app.php, es el controlador frontal y articulo/1 es una ruta de la aplicación.

  • app_dev.php:es uno de los controladores frontales de la aplicación. Su función es la misma que el app-dev. Este controlador frontal es el utilizado para el desarrollo, para lo cual añade una barra de depuración que ofrece información sobre todo lo relacionado con la ejecución de la aplicación.
Barra de depuración

Al terminar el desarrollo de la aplicación este debe pasar al controlador frontal app.dev que es el controlador para producción.

  • config.php: ayuda a la configuración del Framework desde el navegador, no es necesario realizar la configuración desde esta página pero si es un usuario principiante es bueno realizarlo de esta manera para saber como configurar posteriormente el servidor. Tener en cuenta que se deben de tener los permisos en el directorio app/config para que los cambios puedan realizarse. Para acceder a esta página se debe dar clic en Config en la paǵina app_dev.php del proyecto.
Config de Symfony2
  • bundles/nombreBundle: este directorio contiene todas las css,javascript, imágenes, etc. de la aplicación ordenadas según como el programador haya decidido. nombreBundle serán todos los bundles que tengamos en nuestra aplicación que se requiera el uso de los assets; generalmente, solo será uno que es donde tendremos las plantillas de la aplicación.

Configuración de la base de datos

Creación de usuario, base de datos y restauración de la base ejemplo

Para este ejemplo se utilizará el gestor de base de datos PostgreSQL 9.1. Primero crear un usuario que será el que se conectará desde la aplicación a la base de datos. Para ello, abrir una consola como usuario root y escribir:

su postgres

Creación de usuarios y base de datos desde consola

Primero se debe crear el usuario con el que se trabajará, para ello se escribe en consola:

createuser -DRSP nombreUsuario
D: No puede crear base de datos
R: No puede crear roles
S: No es superusuario
P: Para que muestre un mensaje en donde se pida la contraseña del nuevo usuario

Para crear la base de datos se escribe:

createdb nombreBaseDatos -O nombreUsuario
O: Dueño de la base de datos

Restauración base ejemplo desde consola

Para cargar la base de datos de ejemplo, dirigirse al directorio en donde se tiene el esquema y digitar en consola:

$ psql -U nombreUsuario -d nombreBaseDatos -f nombreArchivoACargar.sql

Ejemplo para proyecto Symfony

  • Crear un usuario con el nombre de user_db con la contraseña user.
  • Crear un archivo denominado ejemplo.sql con el contenido que se presenta a continuación; luego cargarlo :
CREATE TABLE estudiante(
  id				serial,
  carnet			VARCHAR(15) UNIQUE NOT NULL,
  nombres			VARCHAR(100) NOT NULL,
  apellidos			VARCHAR(100) NOT NULL,
  id_asignatura_inscrita	INTEGER  NOT NULL
);
CREATE TABLE asignatura(
  id				serial,
  nombre			VARCHAR(100) UNIQUE NOT NULL,
  id_evaluacion_realizada	INTEGER  NOT NULL
);
CREATE TABLE evaluacion(
  id				serial,
  porcentaje		DECIMAL	NOT NULL,
  nota				DECIMAL NOT NULL
);
ALTER TABLE estudiante add primary key (id);
ALTER TABLE asignatura add primary key (id);
ALTER TABLE evaluacion add primary key (id);
ALTER TABLE estudiante add foreign key (id_asignatura_inscrita) references asignatura(id);
ALTER TABLE asignatura add foreign key (id_evaluacion_realizada) references evaluacion(id);

Configurar la base desde symfony

Para configurar la base de datos modificar el archivo parameters.yml. Si no se conoce la estructura de este archivo, es posible realizarlo desde la Symfony2 haciendo clic al botón Configure.

Botón Configure

Al hacer esto aparecerá la siguiente ventana:

Pantalla de configuración

Aquí se deberá configurar todo lo referente a la base de datos; como el gestor de la base de datos, usuario y contraseña con el que se conectará, nombre de la base. Al finalizar hacer clic en Next Step, con esto aparecerá una nueva ventana en donde configuraremos el Secret Global de nuestro sitio. Si se desea generar un nuevo Secret dar clic en Generate sino dar clic en Next Step.

Global Secret

La pantalla que nos aparecerá es el archivo parameters.yml que se ha configurado con la información contenida en las ventanas anteriores. Si el archivo es editable por Apache este se escribirá; pero por motivos de seguridad no es recomendable. Así que como se muestra en la siguiente imagen, se presentará un aviso que no ha sido sobrescrito que se copie y pegue en dicho archivo.

Parameters.yml generado

Creación de un Bundle

Un bundle o paquete es nada más que un directorio que alberga todo relacionado con una función específica, incluyendo las clases PHP, configuración, e incluso hojas de estilo y archivos JavaScript.

La recomendación que se da para el espacio de nombres del bundle es el siguiente:Fabricante o Dueño del proyecto seguido del nombre del sistema, alguna categoría (opcional) y el nombre propio del paquete con el sufijo bundle. El espacio de nombre quedaría de la siguiente manera: Fabricante/Sistema/Categoria/nombreBundle. Ejemplo:

  • Minsal/Sigep/combustibleBundle
  • Minsal/Sidpla/rrhh/capacitacionBundle
  • Sigep/mantenimientoBundle
Nota: el espacio de nombre es decisión del desarrollador; esta es solo una recomendación.

Se procede a crear un nuevo bundle para el proyecto denominado minsal/academicaBundle. Abrir la consola y como usuario normal dirigirnos al directorio de nuestro proyecto, ejecutar el siguiente comando desde la consola:

php app/console generate:bundle

Al hacer esto en la consola aparecerá lo siguiente:

Creación Bundle Paso 1

El primer paso es seleccionar el namespace o espacio de nombre del bundle. Como se menciono anteriormente se llamará minsal/academicaBundle asi que digitamos esto en la consola y presionamos enter.

Creación Bundle Paso 2

En la siguiente imagen muestra el nombre con que se conocerá el paquete creado. La opción predeterminada es la concatenacion de todo el espacio de nombre del bundle sin la pleca (/). Si se deseea cambiar este nombre solo se digita el nuevo nombre y presionar enter. En el caso que se desee el preterminado solo presionar enter.

Creación Bundle Paso 3

Ahora la aplicación console pregunta donde se quiere generar el paquete, se pude cambiar la ruta si es lo que se desea; si no es así presionar enter.

Creación Bundle Paso 4

Console pregunta el formato con el que se desea crear la configuración de symfony. Los formatos disponibles son: yml, php, annotacion y xml. Es decisión del desarrollador que tipo de formato se utilizará. En este caso utilizaremos yml y presionar enter.

Creación Bundle Paso 5

En la siguiente imagen pregunta que si se requiere generar la estructura completa.Esta opción generará algunos directorios y archivos extras que siguen las recomendaciones de Symfony2 para alojar código. Para este ejemplo solo generaremos lo básico así que se dejará la opción por defecto y presionamos enter.

Creación Bundle Paso 6

Se presenta un resumen del paquete que se creará; si se esta seguro de querer generar el paquete presionar enter, si no es así escribir no y se cancelará la generación.

Creación Bundle Paso 7

Al terminar la generación del bundle se presentan todos aquellos archivos que han sido modificados por la generación del bundle. Estos archivos son: appKernel.php y routing.yml. Ambos archivos se encuentran alojados en el directorio app/ de la aplicación.


Verificación de la creación

Para verificar si se ha creado el paquete o Bundle se revisarán el directorio de la aplicación y algunos archivos esenciales para la configuración. Para este ejemplo, se revisarán los archivos desde NetBeans pero puede realizarse con cualquier otra aplicación.

  • Verificar archivo appKernel.php : dentro del directorio app/ deberá de encontrarse el archivo appKernel.php, abrir el archivo y dentro de él deberá estar una linea siguiente:
new minsal\academicaBundle\minsalacademicaBundle(),

dentro de un arreglo denominado bundles, así como se muestra en la siguiente figura:

appKernel.php
  • Verificar archivo routing.yml : dentro del directorio app/config/ deberá encontrarse el archivo routing.yml, al abrir este archivo encontraremos en la cabecera del archivo datos sobre la ruta que se dirigirá al paquete.
    • minsalacademica: Es el nombre que coloca para hacer referencia al paquete que se acaba de crear. Este nombre puede cambiarse según las necesidades de cada desarrollador.
    • resource: "@minsalacademicaBundle/Resources/config/routing.yml" esta línea indica que todas las rutas de este paquetes se encontraran dentro del Paquete minsalacademicaBundle dentro del directorio Resource/config/
    • prefix: / representa un prefijo para acceder a este paquete por la URL. Por ejemplo si se coloca /academica esta palabra aparecerá en todas las rutas en donde academicaBundle este involucrado


routing.yml
  • Verificar la creación de los directorios : dentro de NetBeans, desplegar el directorio src/ y deberá encontrar el directorio minsal/academicaBundle/, como se muestra en la siguiente figura:
Directorio academicaBundle
Probar la el nuevo bundle colocando en la URL la siguiente dirección: http://symfony.localhost/app_dev.php/hello/DTIC deberá aparecer lo siguiente
Prueba academicaBundle

A continuación se explicará la secuencia que Symfony realiza para poder mostrar una página.

  • Llama routing.yml: Lo primero que hace symfony al escribir una URL es buscar a que paquete debe llamar. Con la URL anterior desde el momento que se coloca /hello/DTIC se sabes que por la primera pleca '/' se esta llamando al paquete academicaBundle por el archivo routing.yml de Symfony. Ahora nos dirigimos al directorio Resource/config/ y ahí encontraremos el archivo routing.yml del paquete como se muestra en la siguiente figura:
routing.yml academicaBundle

Se estudiará cada una de las líneas que se muestran en la imagen:

#routing.yml del paquete academicaBundle todas las lineas que inicien con un # son comentarios en los archivos yml.

minsalacademica_homepage: es el nombre identificativo de la ruta. Como programadores desde la vista podemos llamar a un determinado controlador con el nombre que aparezca en esta línea.

pattern: /hello/{name} es la URL que aparecera en el sitio. Todas las palabras que se encuentren entre llaves {} son variables que se envían al controlar.

defaults: { _controller: minsalacademicaBundle:Default:index } Es el nombre del controlador que se esta utilizando. Debe de respetarse el siguiente orden de nombre para llamar al controlador:

nombrePaquete:nombreControlador:accionARealizar

En el ejemplo significa que dentro del paquete academicaBundle, existe un controlador llamado Default y que tiene un método denominado index

  • Llama al controlador: el controlador que se llama para el ejemplo es el Default. Todos los controladores del paquete se encuentran ubicados en la carpeta Controller y el nombre de la clase controlador siempre debe tener la forma: nombreControladorController.php . La clase debe contener como mínimo lo que se muestra en la siguiente imagen:
DefaultController.php academicaBundle

namespace minsal\academicaBundle\Controller es el directorio en donde se encuentra alojado el controlador.

use Symfony\Bundle\FrameworkBundle\Controller\Controller; con esta línea se esta importando la clase controller de Symfony para ser utilizada por el desarrollador.

class DefaultController extends Controller hereda de la clase controlador de symfony.

public function indexAction($name) método index del controlador. Todos los métodos que deban ser llamados por un controlador deberán llevar el sufijo Action luego del nombre.

return $this->render('minsalacademicaBundle:Default:index.html.twig', array('name' => $name)); se esta llamando a la vista. Para las vistas de utilizará Twig por esa razón todas las plantillas deberan llevar la extensión twig. La vista que se esta llamando esta ubicada en el paquete minsalacademicaBundle en la carpeta Default y se llama index.html.twig.

  • Llamar a la vista: para este ejemplo la vista contiene lo siguiente:
index.html.twig academicaBundle

Todo lo que se encuentre entre doble llaves {{ }} son variables tipo Twig, estas variables son enviadas desde la url al controlador; y el controlador las envía a la vista para ser utilizadas.

Creación de Bundle con configuración Annotation

Crear un bundle con el namespace minsal/academicaAnBundle con la excepción que para la configuración se utilizará annotation. La distribución de los archivos queda como se muestra a continuación:

Distribución de minsal/academicaAnBundle

Verificación de la creación

  • Verificar el archivo appKernel.php: dentro de appKernel.php, el nuevo bundle se verá como se muestra a continuación:
appKernel.php
  • Verificar archivo routing.yml: dentro del routing.yml justo sobre el prefix se agregó una línea:
    • type: annotation esta línea indica que las rutas de este paquetes están definidas por annotation.
routing.yml
Nota: el archivo routing.yml del paquete no se creará porque se seleccionó annotation para
la generación de la configuración.
  • Llamada al controlador: cuando la ruta principal llama al controlador Default, al abrir el controlador se encuentran las rutas para cada método como se muestra en la siguiente imagen:
DefaultController.php academicaAnBundle

Como se aprecia en la imagen anterior, la ruta inicial está definida por las siguientes líneas:

@Route("/hello/{name}") Esta línea es la que define la ruta que se verá en la URL.

@Template() en esta línea se define la plantilla que se utilizará.

Si se desea que la ruta tenga un nombre, se debe agregar el nombre como se muestra a continuación:

@Route("/hello/{name}",name="minsalacademicaAn_homepage")

Para cambiar el template que se muestra; a nivel de ejemplo, copiar el index.html.twig en el directorio view y renombrarlo a muestra.html.twig. Abrir el archivo y cambiar la palabra Hello por Bienvenido/a. Quedará como se muestra a continuación:

Directorio View
muestra.html.twig

Para cambiar la plantilla, escribir dentro de Template lo siguiente: @Template("minsalacademicaAnBundle::muestra.html.twig")

El controlador debe quedar como se muestra a continuación:

DefaultController.php

Probar la url http://symfony.localhost/app_dev.php/nuevo/DTIC

DefaultController.php

2. Desarrollo_web_Symfony2_parte_3

Herramientas personales
Espacios de nombres

Variantes
Acciones
Navegación
Herramientas