Guía rápida: Symfony2


 

Introducción.

En esta vista rápida se irán documentando comandos y aspectos importantes necesarios para trabajar con symfony2.

Para empezar con symfony2 puede verse:

1. Apache.

1.1. Instalación Apache y MySQL.

# apt-get install mysql-client mysql-server openssl curl git getmail4 rkhunter unzip bzip2 arj nomarch lzop cabextract libnet-ldap-perl libauthen-sasl-perl daemon libio-string-perl libio-socket-ssl-perl libnet-ident-perl zip apache2 apache2-doc apache2-utils libexpat1 ssl-cert libapache2-mod-php5 php5 php5-common php5-gd php5-mysql php5-imap php5-cli php5-cgi php-pear php-auth php5-curl php5-mcrypt mcrypt php5-imagick imagemagick libruby autoconf automake1.9 libtool flex bison debhelper sendmail php5-intl php-apc libpcre3-dev

1.2. Comprobar configuración para Symfony.

Antes de empezar a desarrollar con symfony 2, es necesario que veamos si tenemos la configuración del servidor web correcta:

$ php app/check.php

1.3. Virtual Host.

Suponiendo que el document root esté en /var/www/symfony/ y que el virtual host estará en /etc/apache2/sites-available/010-symfony.conf

    DocumentRoot /var/www/symfony/web
    ServerName symfony.dev
    DirectoryIndex app.php
                    
    ErrorLog ${APACHE_LOG_DIR}/symfony-error.log
    LogLevel warn
    CustomLog ${APACHE_LOG_DIR}/symfony-access.log combined

    
        AllowOverride All
        Require all granted
    

Si le hemos puesto un server name (recomendado) también debemos actualizar el fichero /etc/hosts.

# nano /etc/hosts

// Añadimos detrás de localhost el server name.
127.0.0.1     localhost symfony.dev

Activamos el módulo rewrite de apache y el nuevo virtual host:

# a2enmod rewrite

# a2ensite 010-symfony.conf

# service apache2 reload

2. Permisos Carpetas.

Symfony necesita escribir en las carpetas logs y cache, les damos permisos:

# chmod -R 777 app/cache app/logs

3. Vista Demo.

En desarrollo vamos a la URL: http://localhost/symfony/web/app_dev.php/

En esta vista se muestra una barra inferior que proporciona mucha información sobre la ejecución de la aplicación.

En producción se usa el controlador app.php en vez de app_dev.php.

4. Limpiar caché.

Cuando se cambia un fichero de configuración debemos limpiar la cache para que el cambio se haga efectivo:

Para el entorno de desarrollo:

$ php app/console cache:clear

Para el entorno de producción:

$ php app/console cache:clear –env=prod

5. Incluir Assets.

Cada vez que incluyamos un asset (css, javascript, imágenes…) debemos lanzar este comando para que symfony pueda cargarlo:

$ php app/console assets:install web –symlink

Si usamos assetic, los cambios no serán visibles en el entorno de producción hasta que no hagamos lo siguiente:

$ php app/console cache:clear –env=prod –no-debug

$ php app/console assetic:dump –env=prod –no-debug

6. Composer.

6.1. Instalación.

$ curl -s http://getcomposer.org/installer | php

6.2. Actualizar módulos.

$ php composer.phar update

6.3. Instalar bundle de terceros.

Vamos al fichero /composer.json. Al array require agregamos el nuevo bundle (hay que buscar en la documentación para saber la cadena correcta).

Una vez agregada la línea actualizamos los módulos con el comando del apartado 6.2. y composer se encarga de descargar el nuevo bundle.

Cuando finalice, vamos a app/AppKernel.php y registramos el nuevo bundle agregando la ruta al array $bundles en la función registerBundles().

7. Bundles.

7.1. Generar Bundle.

Para generar el esqueleto de un bundle, lanzamos el siguiente comando:

# php app/console generate:bundle

Esto nos hará algunas preguntas sobre la configuración de nuestro nuevo bundle, la primera, el namespace, el cual debe seguir el siguiente patrón:

Fabricante/categoria1/categoria2/../categoriaN/nombrebundleBundle

Bundle namespace: TomJos/Ejemplo/CalendarioBundle

A continuación nos pregunta por el nombre del bundle, entre corchetes nos ofrece una sugerencia.

Bundle name [TomJosEjemploCalendarioBundle]: (Intro para aceptar la sugerencia)

Aunque los bundles se pueden guardar en cualquier ruta, es recomendable guardarlos dentro del directorio src, en la siguiente pregunta nos pedirá dicho directorio y nos ofrecerá también una sugerencia:

Target directory [/var/www/calendario/src]: (Intro para aceptar la sugerencia)

El bundle necesita configuración, sobre todo para mapear las URLs con las acciones llevadas a cabo por el bundle, se puede elegir cualquiera, nosotros elegiremos yml, la siguiente pregunta será sobre el formato de dicha configuración:

Configuration format (yml, xml, php, or annotation): yml

Ya sólo nos queda generar la estructura, lo cual puede hacer symfony por nosotros:

Do you want to generate the whole directory structure [no]? yes
Do you confirm generation [yes]? (Intro para aceptar la sugerencia)
Confirm automatic update of your Kernel [yes]? (Intro para aceptar la sugerencia)
Confirm automatic update of the Routing [yes]? (Intro para aceptar la sugerencia)

Con esto ya se nos habrá creado toda la estructura del bundle bajo la ruta calendario/src/TomJos/Ejemplo/CalendarioBundle/

Los bundles son partes de la aplicación totalmente desacopladas y reutilizables, por ello, es necesario notificar al framework la adición. Para acoplarlo al proyecto debemos hacerlo en el archivo app/AppKernel.php agregando nuestro namespace al método registerBundles(), en nuestro caso ya estará hecho puesto que le dijimos al configurador de bundles que lo hiciera por nosotros.


$bundles = array( 
     ... 
     new TomJos\Ejemplo\CalendarioBundle\TomJosEjemploCalendarioBundle(), 
);

También se debe actualizar la tabla de enrutamiento particular del bundle. La tabla de enrutamiento es la responsable de indicar al framework como deben mapearse las URL’s en acciones PHP. Esto se hace en app/config/routing.yml


tom_jos_ejemplo_calendario:
     resource: "@TomJosEjemploCalendarioBundle/Resources/config/routing.yml"
     prefix: /

Existe otro routing.yml dentro de nuestro bundle, este se encarga de mapear las acciones del controlador con las URLs amigables, cada vez que agreguemos una nueva acción al controller, debemos mapearla en src/ruta/bundle/Resources/config/routing.yml. En nuestro ejemplo:


tom_jos_ejemplo_calendario_homepage:
     pattern: /hello/{name}
	 defaults: { _controller: TomJosEjemploCalendarioBundle:Default:index }

Para probar nuestra acción generada por defecto: http://localhost/calendario/web/app_dev.php/hello/joseca

El resultado será una vista que nos muestre Hello joseca!!!, si cambiamos el nombre al final, cambiará el saludo.

También podemos generar el bundle junto al espacio de nombres y darle opciones por defecto con:

$ php app/console generate:bundle –namespace=TomJos/Ejemplo/CalendarioBundle –format=yml

7.2. Acoplar bundle.

Para acoplar un bundle al framework hay que :

  1. Registrar el espacio de nombre en el sistema de autocarga (fichero app/autoload.php. Este paso no es necesario si ubicamos al bundle en el directorio src.
  2. Registrar al bundle en el fichero app/AppKernel.php. Esta operación se puede hacer automáticamente a través del generador interactivo debundles, pero si fallase por alguna razón (por ejemplo que los permisos de dicho archivo no estén bien definidos). Habría que hacerlo a mano.
  3. Importar las tablas de enrutamiento del bundle en la tabla de enrutamiento de la aplicación.

8. ORM: Doctrine 2.4.

8.1. Configuración de la base de datos.

La base de datos se configura en app/config/parameters.yml. En ese fichero se configura todo lo necesario para conectar con el tipo de base de datos que estemos usando.

También se puede hacer gráficamente a través de la interfaz web, vamos a http://localhost/sitio/web/app_dev.php/ y picamos en configurar.

8.2. Generación de entidades.

$ php app/console doctrine:generate:entity

Lo primero que nos pregunta es el nombre de la entidad, debe ir precedido de nombre de nuestro bundle:

The Entity shortcut name: TomJosEjemploCalendarioBundle:Usuario

A continuación nos pide la forma en que se mapeará el tipo de dato, en nuestro caso lo dejamos en anotaciones.

Configuration format (yml, xml, php, or annotation) [annotation]: (Intro para aceptar la sugerencia)

Lo siguiente es generar los nombres de los campos y tipos a través de la consola. La id va predefinida así que no hace falta generar el campo id.

New field name (press  to stop adding fields): nombre
Field type [string]:(intro para aceptar sugerencia)
Field length [255]: 120

Do you want to generate an empty repository class [no]? yes
Do you confirm generation [yes]? (intro para aceptar sugerencia)

Cuando hayamos terminado de definir los campos, pulsamos intro sin introducir ningún nombre en la primera pregunta. Ahora tendremos que decirle al script si queremos que nos genere el repositorio:Una vez finalizado este proceso se creará una carpeta dentro de nuestro bundle llamada entity donde se habrán generado la clase Usuario y su repositorio.

8.3. Generar Base de Datos a partir de las entidades.

Para crear la base a partir de las entidades generadas usamos:

$ php app/console doctrine:schema:create

Este comando eliminaría la base de datos si existiera y la volvería a crear a partir de las entidades.

Si creasemos un nuevo campo y sólo quisiéramos actualizarla:

$ php app/console doctrine:schema:update –force

Con este comando sólo se agregarían los nuevos campos sin eliminar el contenido de la base de datos.

8.4. Generar Entidades a partir de Base de Datos.

$ php app/console doctrine:mapping:import –force MiBundle xml

$ php app/console doctrine:mapping:convert annotation ./src
$ php app/console doctrine:generate:entities MiBundle

Una vez generadas las clases y si usamos anotaciones, podemos eliminar el archivo xml generado por el primer comando en src/MiBundle/Resources/config/Doctrine/nombre_tabla.orm.xml.

8.5. Eliminar Base de Datos.

$ php app/console doctrine:schema:drop –force

8.6. Insertar en la Base de Datos.

Para usar nuestra entidad y que Doctrine pueda mapear el objeto de la base de datos con la entidad, debemos importar la entidad:


use TomJos\Ejemplo\CalendarioBundle\Entity\Usuario;

Ahora podemos usar el objeto alumno en la clase. Para insertar con doctrine tendríamos que crear un objeto de tipo usuario y pasarselo a Doctrine, si este usuario tiene una id existente en la base de datos se actualizará, si no, se creará uno nuevo.

Ejemplo:


// Creamos al usuario.
$user = new Usuario();
$user->setNombre('Jose');

// Referenciamos al entity manager de doctrine.
$em = $this->getDoctrine()->getManager(); 

// Sincronizamos el objeto con la base de datos.
$em->persist($user); 
// Guardamos. Podríamos haber pasado varios alumnos a persist y se guardarían con flush 
$em->flush();

8.7. Obtener datos de la Base.


// Referenciamos al repositorio de usuarios. 
$repositorio = $this->getDoctrine->getRepository('TomJosEjemploCalendarioBundle:Usuario'); 
// Obtenemos todos los usuarios de la tabla. 
$usuarios = $repositorio->findAll(); 
// Obtenemos un usuario por id. 
$usuario = $repositorio->find($id);

8.8. Generar Formularios.

$ php app/console generate:doctrine:form TomJoseEjemploBundle:Usuario

8.9. Validar relaciones.

$ php app/console doctrine:schema:validate

9. Twig: Plantillas.

Symfony propone un sistema de plantillas basado en un sistema de herencia de 3 niveles soportados por twig.

9.1. Instrucciones básicas.

  • Herencia:

{% extends 'paquete:controlador:plantilla' %}

// Heredar de la plantilla superior en app/Resources/views/
{% extends '::base.html.twig' %}

// Heredar de la plantilla superior del bundle en TomJos/Ejemplo/views/base.html.twig
{% extends 'TomJosEjemploCalendarioBundle::base.html.twig' %}
  • Bloques:

{% block nombre_bloque %} [contenido_por_defecto] {% endblock %}
  • Etiquetas:

// asset: Vincula con elementos css, javascript, imágenes...En este caso en la carpeta web/

// path / url: Calcula la ruta en función del servidor, path = relativa, url = absoluta
Contact

10. Funciones Interesantes Symfony.

10.1. Controlador.

  • Redirect: Esta función redirige la vista hacia la URL que le pasemos por parámetros.
  • Generate URL: Genera una url a partir del nombre de configuración.

Ejemplo uso redirect + generate:


public function redireccionar() {
     return $this->redirect($this->generateUrl('nombre_configuracion_bundle'));
}
  • Render: Carga una plantilla. Puede tomar uno o dos parámetros, el primero sería el nombre lógico de la plantilla a cargar y el segundo un array con formato key => value, que serán los datos del modelo accesibles por la plantilla.

public function listarAction() {
    return $this->render('TomJosEjemploCalendarioBundle:Default:usuarios.html.twig', 
                array('usuarios' => $dao->getUsuarios()));
}

Deja un comentario

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