Autor Tema: Comenzando un proyecto en symfony  (Leído 2557 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado 3l3cTr0n1k_0

  • Recién llegado
  • *
  • Mensajes: 47
  • Karma: +5/-1
    • Ver Perfil
    • El arte de programar
    • Email
Comenzando un proyecto en symfony
« : febrero 24, 2010, 12:04:04 pm »
Introducción

El framework Symfony ha sido un proyecto de Código Abierto por más de tres años y se ha convertido en uno de los framework PHP más populares gracias a sus excelentes características y gran documentación. Esto ha sido una gran tradición desde sus inicios.

En Diciembre de 2005, justo después del primer lanzamiento oficial de Symfony, publicamos el "tutorial Askeet" como una serie de tutoriales, publicados día tras día entre el primero de diciembre y Navidad.

Dicho tutorial ha demostrado ser una herramienta invaluable para promover el framework entre los recién llegados. Muchos programadores aprendieron Symfony gracias a askeet y muchas compañías lo utilizan como su material principal de capacitación.

Pero el tutorial askeet comienza a mostrar su edad y con el lanzamiento de Symfony 1.2, hemos decidido a publicar otro calendario para un nuevo tutorial, Jobeet.

Este tutorial se ha publicado día a día en el blog de Symfony en 2008, y estás leyendo la adaptación del libro.

El Desafío

Cada capítulo/día está destinado a durar aproximadamente una hora, y será la ocasión de aprender Symfony mediante la codificación de un sitio web real, de principio a fin.

Una hora multiplicada por venticuatro hace un día, y eso es exactamente lo que creemos que un programador necesita para aprender los fundamentos de Symfony. Cada día, serán agregadas nuevas características a la aplicación, y nos valdremos de las ventajas de este desarrollo para introducirte a las nuevas funcionalidades de Symfony así como a las mejores prácticas de desarrollo web con Symfony.

Para askeet, el día 21 fue el denominado "consigue un guru symfony por un día". No teníamos ningún plan y la comunidad tenía que proponer una característica a agregar a askeet. Fue un gran suceso y la comunidad decidió que necesitábamos un motor de búsqueda para la aplicación. Y así lo hicimos. El día 21 del tutorial también demostró ser uno de los más populares dentro de los tutoriales de askeet.

Para Jobeet, vamos a celebrar la llegada del invierno/verano con un día 21 denominado "día de diseño". El diseño ganador será presentado al centro{fuente}, y se utilizará en este tutorial para el diseño por defecto. También será utilizado para el diseño del sitio web Jobeet.


Este Tutorial es diferente


Recuerdo los primeros días de PHP4 ¡Ah, la Belle Epoque! PHP era uno de los primeros lenguages dedicados a la web y uno de los más fáciles de aprender.

Pero con la rápida evolución de las tecnologías web, los desarrolladores web deben mantenerse al tanto de las últimas herramientas y mejores prácticas de desarrollo. Por supuesto que la mejor manera de aprender es leyendo blogs, tutoriales y libros. Hemos leído un montón de estos, sea que estén escritos para PHP, Python, Java, Ruby o Perl, y muchos se quedan cortos cuando el autor comienza a mostrar fragmentos de código como ejemplos.

Probablemente estés acostumbrado a leer adevertencias de este tipo:

"Para una aplicación real, no te olvides de agregar validación y un manejo de errores adecuado."

o

"La Seguridad es dejada como un ejercicioo para el lector."

o

"Por supuesto que vas a necesitar escribir tests"

¿Cómo? Estos temas son asuntos importantes. Son quizás la parte más importante de cualquier trozo de código. Como lector, te dejan solo. Si no nos preocupamos por proveer dicha información, los ejemplos resultan mucho menos útiles, no pudiendo utilizarlos como un buen punto de inicio. Eso no puede ser así, ya que la seguridad, la validación, el manejo de errores y las tests, por nombrar algunos, es lo que nos lleva a programar de forma correcta.

En este tutorial nunca vas a ver oraciones de ese tipo, vamos a escribir tests, manejo de errores, código para validación, y nos aseguraremos de desarrollar una aplicación segura. Todo ello porque Symfony es sinónimo de programación, de buenas prácticas y de como desarrollar aplicaciones profesionales para la empresa. Podemos darnos dicho lujo porque Symfony provee todas las herramientas necesarias para programar esos aspectos de forma fácil y sin la necesidad de escribir mucho código.

Debido a que la validación, el manejo de errores, la seguridad y los tests son ciudadanos de primera clase en Symfony, no nos va a llevar mucho tiempo explicarlos. Esta es una de las tantas razones por las cuales hay que utilizar un framework para proyectos de la vida real.

Todo el código que leerás en este tutorial es código que puedes usar en un proyecto de la vida real. Te invitamos a que copies y pegues el código en tus proyectos o que simplemente robes trozos completos del mismo.

El Proyecto

La aplicación a diseñar podría haber sido otro motor de blogs, pero nosotros queremos usar Symfony en algo útil. El objetivo es demostrar que Symfony puede ser usado para desarrollar aplicaciones con estilo y poco esfuerzo.

Al contenido del proyecto lo vamos a mantener en secreto por un días más ya que tenemos mucho para hacer por hoy. De todas formas, ya sabes el nombre de la aplicación: Jobeet.


¿Qué hacemos hoy?

Como 24 horas es más que suficiente para desarrollar una aplicación con Symfony, hoy no vamos a escribir código PHP. Pero incluso sin escribir una sola linea de código vas a entender los beneficios de utilizar un framework como Symfony simplemente al configurar un nuevo proyecto.

El objetivo del día es configurar un entorno de desarrollo y mostrar una página web de la aplicación en el navegador web. Esto incluye la instalación de Symfony, la creación de una aplicación y la configuración del servidor web.

Pre requisitos.

Primero que nada, asegúrate de que cuentas con un entorno de desarrollo web funcioando: un servidor web (Apache por ejemplo), un motor de bases de datos (MySQL, PostgreSQL, o SQLite), y PHP 5.2.4 o superior.

Como utilizaremos la línea de comandos constantemente, es preferible utilizar un sistema operativo tipo Unix, si utilizas Windows, va a funcionar de todas formas, simplemente vas a tener que ingresar comandos en la consola cmd.



Los comandos de Unix pueden serte útiles dentro de un entorno Windows. Si quisieras utilizar herramientas como tar, gzip, or grep en Windows puedes instalar
Cygwin. La documentación oficial puede ser un poco escasa pero una guía interesante puede encontrarse aquí. Los aventureros también pueden probar con los Servicios Windows para Unix. de Microsoft.


Como este tutorial se concentra en el framework Symfony, asumimos que ya cuentas con un conocimiento sólido de PHP 5 y de Programación Orientada a Objetos.

Instalación de Symfony

Primero crea un directorio donde albergar los archivos relacionados al proyecto Jobeet:
Código: c [Seleccionar]

$ mkdir -p /home/sfprojects/jobeet
$ cd /home/sfprojects/jobeet


En Windows:

Código: c [Seleccionar]

c:\> mkdir c:\development\sfprojects\jobeet
c:\> cd c:\development\sfprojects\jobeet



Se recomienda que los usuarios Windows configuren sus proyectos en una ruta sin espacios. Intenta no utilizar el directorio Documents and Settings, incluyendo cualquier ruta bajo Mis Documentos.


Crea un directorio para alojar los archivos del framework Symfony:
Código: c [Seleccionar]

$ mkdir -p lib/vendor


La página de instalación en el sitio web de Symfony listas y compara todas las versiones disponibles de Symfony.

Ya que este tutorial fue escrito para Symfony 1.2, ve a la página de instalación de Symfony 1.2.

Bajo la sección "Source Download", vas a encontrar el archivo en formato .tgz o en formato .zip. Descarga el archivo y colocarlo bajo el directorio lib/vendor que acabas de crear y descomprimelo:

Código: c [Seleccionar]

$ cd lib/vendor
$ tar zxpf symfony-1.2.2.tgz
$ mv symfony-1.2.2 symfony
$ rm symfony-1.2.2.tgz


En Windows puedes descomprimirlo en el explorador de archivos. Una vez que hayas renombrado el directorio a symfony, la ruta debería ser la siguiente: c:\development\sfprojects\jobeet\lib\vendor\symfony.

Como las configuraciones PHP varían mucho de una distribución a otra, tenemos que comprobar que tu configuración PHP cumple los requisitos mínimos de Symfony. Inicia el script de comprobación de la configuración que viene con Symfony desde la línea de comandos:

Código: c [Seleccionar]

$ cd ../..
$ php lib/vendor/symfony/data/bin/check_configuration.php


Si hay un problema, la salida te dará consejos sobre cómo solucionarlo. También debes ejecutar el script desde un navegador ya que la configuración PHP puede ser diferente. Copia el archivo en algún lugar bajo el directorio raíz del servidor web y accede al archivo. No te olvides de quitar el archivo del directorio raíz web después:
Código: c [Seleccionar]

$ rm web/check_configuration.php




Si el script no muestra ningún error, comprueba que Symfony se ha instalado correctamente usando la línea de comandos para mostrar la versión (nota la letra V mayúscula):

Código: c [Seleccionar]

$ php lib/vendor/symfony/data/bin/symfony -V


En Windows:

Código: c [Seleccionar]

c:\> cd ..\..
c:\> php lib\vendor\symfony\data\bin\symfony -V


Si eres curioso sobre lo que esta herramienta de línea de comandos puede hacer por tí, escribe symfony para ver una lista de las opciones y las tareas disponibles:

Código: c [Seleccionar]

$ php lib/vendor/symfony/data/bin/symfony


En Windows:

Código: c [Seleccionar]

c:\> php lib\vendor\symfony\data\bin\symfony


La línea de comandos de Symfony es el mejor amigo del programador. Te brinda un montón de utilidades para aumentar tu productividad en las actividades del día a día como limpiar el cache, generar código y mucho más.

Configuración del Proyecto

En Symfony, las aplicaciones que comparten el mismo modelo de datos se agrupan en proyectos. Para el proyecto Jobeet, vamos a tener dos aplicaciones diferentes: un frontend y un backend.

Creación del Proyecto

Desde el directorio jobeet, ejecuta la tarea symfony generate:project para realmente crear el proyecto symfony:

Código: c [Seleccionar]

$ php lib/vendor/symfony/data/bin/symfony generate:project jobeet


En Windows
Código: c [Seleccionar]

c:\> php lib\vendor\symfony\data\bin\symfony generate:project jobeet


La tarea generate:project genera por defecto la estructura de directorios y archivos necesarios para un proyecto symfony:
Directorio    Descripción
apps/    Hospeda todas las aplicaciones del proyecto
cache/     Los archivos en caché
config/    Los archivos de configuración del proyecto
lib/    Las bibliotecas y clases del proyecto
log/    Los archivos de registro
plugins/    Los plugins instalados
test/     Los archivos de pruebas unitarias y funcionales
web/    El directorio raíz web (véase más adelante)


¿Por qué Symfony genera tantos archivos? Uno de los principales beneficios de la utilización de un completo framework es normalizar tus desarrollos. Gracias a estructura predeterminada de archivos y directorios de Symfony, cualquier desarrollador con algunos conocimientos de Symfony puede asumir el mantenimiento de cualquier proyecto symfony. En cuestión de minutos, será capaz de bucear en el código, corregir los errores, y añadir nuevas funciones.


La tarea generate:project también ha creado un atajo symfony en el directorio raíz del proyecto Jobeet para reducir el número de caracteres que tienes que escribir cuando se ejecuta una tarea.

Así, a partir de ahora, en lugar de utilizar la ruta completa al programa de Symfony, vamos a utilizar el atajo symfony.

Creación de una Aplicación

Ahora, crear la aplicación frontend ejecutando la tarea generate:app:

Código: c [Seleccionar]

$ php symfony generate:app --escaping-strategy=on --csrf-secret=UniqueSecret frontend


 Como el archivo symfony es ejecutable, los usuarios de Unix puede reemplazar todas las apariciones de 'php symfony' por './symfony' de ahora en adelante.

En Windows puedes copiar el archivo 'symfony.bat' a tu proyecto y usar 'symfony' en lugar de 'php symfony':

Código: c [Seleccionar]

c:\> copy lib\vendor\symfony\data\bin\symfony.bat .


Una vez más, la tarea generate:app crea por defecto la estructura necesaria de directorios para una aplicación bajo el directorio apps/frontend:
Directorio    Descripción
config/    Los archivos de configuración de la aplicación
lib/    Las bibliotecas y clases de la aplicación
modules/    El código de la aplicación (MVC)
templates/    La plantilla global

Todos los comandos symfony debe ser ejecutados en el directorio raíz del proyecto a menos que se diga expresamente otra cosa.


Al llamar a la tarea generate:app, también hemos pasado dos opciones relacionadas con la seguridad:

    * --escaping-strategy: Permite escapar la salida para evitar ataques XSS
    * --csrf-secret: Permite tokens de sesión en los formularios para prevenir los ataques CSRF


Pasando estas dos opciones a la tarea, hemos asegurado nuestro futuro desarrollo de las dos vulnerabilidades más extendidas se encuentran en la web. Así es, Symfony automáticamente toma las medidas de seguridad por nosotros.


Si no sabes nada acerca de XSS o CSRF, date un tiempo para aprender más de estas vulnerabilidades de seguridad.


La Ruta de Symfony

Puede obtener la versión utilizada de Symfony por su proyecto escribiendo:
Código: c [Seleccionar]

$ php symfony -V


La opción -V también muestra la ruta de acceso al directorio de instalación de Symfony, se almacena en config/ProjectConfiguration.class.php:

Código: php [Seleccionar]

// config/ProjectConfiguration.class.php
require_once '/Users/fabien/work/symfony/dev/1.2/lib/autoload/sfCoreAutoload.class.php';


Para mejorar la portabilidad, cambia la ruta absoluta a la instalación de Symfony por una relativa:
Código: php [Seleccionar]

// config/ProjectConfiguration.class.php
require_once dirname(__FILE__).'/../lib/vendor/symfony/lib/autoload/sfCoreAutoload.class.php';


De esta manera, puedes mover el directorio del proyecto Jobeet a cualquier lugar de tu máquina u a otra, y éste funcionará.
Los Entornos

Si revisas el directorio web/, encontrarás dos archivos PHP: index.php y frontend_dev.php. Estos archivos son llamados controladores frontales: todas las peticiones a la aplicación se hacen a través de ellos. Pero, ¿por qué tenemos dos controladores frontales si hemos definido sólo una aplicación?

Ambos archivos apuntan a la misma aplicación pero para distintos entornos. Cuando desarrollas una aplicación, excepto si desarrollas directamente en el servidor de producción, necesitas varios entornos:

    * El entorno de desarrollo: Este es el ambiente utilizado por desarrolladores web para añadir nuevas funciones, corregir los errores, ...
    * El entorno de prueba: Este entorno se utiliza para probar automáticamente la aplicación.
    * El entorno staging: Este entorno es utilizado por el cliente para poner a prueba la aplicación e informar errores o características faltantes.
    * El entorno de producción: Este es el entorno donde un usuario final interactúa.

¿Qué hace que un entorno sea único? En el entorno de desarrollo, la aplicación necesita registrar todos los detalles de una petición para facilitar la depuración, debe mostrar la excepción en el navegador, pero la cache debe ser deshabilitada para que todos los cambios realizados al código se tengan en cuenta de inmediato. El entorno de desarrollo debe ser optimizado para el desarrollador:



En el entorno de la producción, la aplicación deberá mostrar mensajes de error personalizados en lugar de excepciones, y por supuesto, la capa del cache debe estar activada. El entorno de producción debe ser optimizado para el rendimiento y la experiencia del usuario final.



Resumiendo: un entorno symfony es un conjunto único de ajustes de configuración. El framework Symfony incluye tres de ellos: dev, test, y prod.

Si abres los archivos de los controladores frontales, verás que la única diferencia es el ajuste del entorno:

Código: php [Seleccionar]

// web/index.php
<?php
 
require_once(dirname(__FILE__).'/../config/ProjectConfiguration.class.php');
 
$configuration = ProjectConfiguration::getApplicationConfiguration('frontend', 'prod', false);
sfContext::createInstance($configuration)->dispatch();



Definir un nuevo entorno symfony es tan simple como crear un nuevo controlador frontal. Veremos más adelante cómo cambiar la configuración de un entorno.



Configuración del Servidor Web: La Forma Fea


En la sección anterior, un directorio se ha creado para alojar el proyecto Jobeet. Si lo creaste bajo el directorio "raíz web" de tu servidor web, ya puedes acceder al proyecto en un navegador web.

Por supuesto, como no hay ninguna configuración, es muy rápido para establecer, pero intenta tener acceso al archivo config/databases.yml en tu navegador y comprederás las malas consecuencias de esta actitud perezosa. Si el usuario conoce que tu sitio web esta desarrollado con Symfony, él tendrá acceso a un montón de archivos delicados.

Nunca uses esta configuración en un servidor de producción, lee la siguiente sección para aprender cómo configurar su servidor web correctamente.
Configuración del Servidor Web: La forma segura

Una buena práctica web es poner bajo el directorio raíz web sólo los archivos a los que necesita tener acceso el navegador web: las hojas de estilo, JavaScripts, o imágenes. Te recomendamos almacenar estos archivos en el subdirectorio web de un proyecto symfony.

Si echas un vistazo a este directorio, encontrarás algunos sub-directorios para los recursos web y los dos archivos de los controladores frontales. Los controladores frontales son los únicos archivos PHP que necesitan estar bajo el directorio raíz web. Todos los demás archivos PHP se pueden ocultar del navegador, la cual es una buena idea en lo que respecta a seguridad.

La configuración del Servidor Web


Ahora es el momento de cambiar tu configuración de Apache para que el nuevo proyecto sea accesible para el mundo.

Busca y abre el archivo de configuración httpd.conf y añade la siguiente configuración al final:

Código: c [Seleccionar]

# Asegúrate de tener sólo una vez esta línea en su configuración
NameVirtualHost 127.0.0.1:8080

# Esta es la configuración de Jobeet
Listen 127.0.0.1:8080

<VirtualHost 127.0.0.1:8080>
  DocumentRoot "/home/sfprojects/jobeet/web"
  DirectoryIndex index.php
  <Directory "/home/sfprojects/jobeet/web">
    AllowOverride All
    Allow from All
  </Directory>

  Alias /sf /home/sfprojects/jobeet/lib/vendor/symfony/data/web/sf
  <Directory "/home/sfprojects/jobeet/lib/vendor/symfony/data/web/sf">
    AllowOverride All
    Allow from All
  </Directory>
</VirtualHost>




     El alias /sf le da acceso a las imágenes y los archivos JavaScript necesarios para adecuadamente mostrar las páginas symfony por defecto y la barra de herramientas de depuración web.

    En Windows, es necesario sustituir la linea Alias con algo como:
Código: c [Seleccionar]

    Alias /sf "c:\development\sfprojects\jobeet\lib\vendor\symfony\data\web\sf"

    Y /home/sfprojects/jobeet/web debería ser sustituida por:
Código: c [Seleccionar]

    c:\development\sfprojects\jobeet\web



En esta configuración, Apache escucha en el puerto 8080 de tu máquina, por lo que el sitio web de Jobeet será accesible en la siguiente URL:

http://localhost:8080/

Puedes cambiar 8080 por cualquier número mayor que 1024, ya que no se requieren derechos de administrador en esos puertos.

    Configurar un nombre dedicado de dominio para Jobeet

    Si eres el administrador de tu equipo, es mejor configurar un virtual host en lugar de añadir un nuevo puerto cada vez que se inicia un nuevo proyecto. En lugar de añadir un puerto y agregar una declaración Listen, elige un nombre de dominio y añade la declaración ServerName:

Código: c [Seleccionar]

    # This is the configuration for Jobeet
    <VirtualHost 127.0.0.1:80>
      ServerName jobeet.localhost
      <!-- same configuration as before -->
    </VirtualHost>

    El nombre de dominio jobeet.localhost tiene que ser declarado localmente. Si se ejecuta un sistema Linux, que tiene que hacerse en el archivo /etc/hosts. Si ejecuta Windows XP, este archivo se encuentra en el directorio C:\WINDOWS\system32\drivers\etc\.

    Añade la siguiente línea:
Código: c [Seleccionar]

    127.0.0.1         jobeet.localhost

    Tip Nota del Traductor Cuando se complican con estos pasos, los usuarios de Distribuciones Linux, como Ubuntu, pueden usar una herramienta gráfica que simplique aún más esta configuración. Rapache, es un software para sistemas Gnome que hace la configuración básica y necesaria, en los archivos /etc/hosts y httpd.conf, en un solo paso además de permitir el reinicio de Apache con un clic.

Probar la nueva configuración


Reinicia Apache, y comprueba que ahora tienes acceso a la nueva aplicación abriendo un navegador y escribiendo http://localhost:8080/index.php/, o http://jobeet.localhost/index.php/ dependiendo de la configuración de Apache que has elegido en la sección anterior.




Si tienes el módulo Apache mod_rewrite instalado, puedes remover la parte /index.php/ de todas las URL. Esto es posible gracias a las reglas de reescritura configuradas en el archivo web/.htaccess.


Deberías tratar de acceder a la aplicación en el entorno de desarrollo. Escribe la siguiente URL:

http://jobeet.localhost/frontend_dev.php/

La web debug toolbar o barra de herramientas de depuración web debería mostrarse en la esquina superior derecha, incluidos los iconos, demostrando que tu configuración alias sf/ es correcta.




La configuración es un poco diferente si quieres ejecutar Symfony sobre un server IIS server en un sistema Windows. Busca la manera de configurarlo en el tutorial.


Subversion

Es una buena práctica utilizar control de versiones de código fuente en el desarrollo de una aplicación web. Usar el control de versiones de código fuente nos permitirá:

    * trabajar con confianza
    * volver a una versión anterior si un cambio rompe algo
    * permitir a más de una persona para trabajar eficientemente en el proyecto
    * tener acceso a todas las versiones sucesivas de la aplicación

En esta sección, vamos a describir cómo utilizar Subversion con Symfony. Si utilizas otra herramienta de control de código fuente, debe ser muy fácil de adaptar según lo descripto para Subversion.

Suponemos que ya tienes acceso a un servidor Subversion.


    Si no tienes un servidor Subversion a tu disposición, puedes crear uno gratis en Google Code o solo escribir "free subversion repository" en Google para tener muchas más opciones.


En primer lugar, crea un nuevo repositorio para el proyecto jobeet:
Código: c [Seleccionar]

$ svnadmin create /path/to/jobeet/repository

En tu máquina, crea la estructura básica de directorios:

Código: c [Seleccionar]

$ svn mkdir -m "created default directory structure" http://svn.example.com/jobeet/trunk http://svn.example.com/jobeet/tags http://svn.example.com/jobeet/branches


Y comprueba el directorio vacío trunk/ :
Código: c [Seleccionar]

$ cd /home/sfprojects/jobeet
$ svn co http://svn.example.com/jobeet/trunk/ .


Entonces, elimina el contenido de los directorios cache/ y log/ porque no queremos ponerlos en el repositorio.
Código: c [Seleccionar]

$ rm -rf cache/* log/*

Ahora, asegúrate de poner los permisos de escritura sobre los directorios cache y logs a los niveles apropiados a fin de que tu servidor web pueda escribir en ellos:
Código: c [Seleccionar]

$ chmod 777 cache/ log/

Ahora, importa todos los archivos y directorios:
Código: c [Seleccionar]

$ svn add *

Como nunca queremos enviar los archivos situados en los directorios cache/ y /log, es necesario especificar una lista de ignorados:
Código: c [Seleccionar]

$ svn propedit svn:ignore cache

El editor de texto por defecto configurado para SVN debería ejecutarse. Subversion debe hacer caso omiso de todo el contenido de este directorio:
Código: c [Seleccionar]

*


Guardar y cerrar. Has terminado.

Repite el procedimiento para el directorio log/:
Código: c [Seleccionar]

$ svn propedit svn:ignore log

Y escribe:
Código: c [Seleccionar]

*

Finalmente, enviamos (commit) estos cambios al repositorio:
Código: c [Seleccionar]

$ svn import -m "made the initial import" . http://svn.example.com/jobeet/trunk



Los usuarios de Windows pueden utilizar el excelente cliente TortoiseSVN para gestionar sus repositorio de Subversion. Los usuarios de Linux tienen muchas opciones y una de ellas es utilizar el excelente cliente Rapidsvn para gestionar sus repositorio de Subversion.


Nos vemos Mañana

Bien, ¡el tiempo terminó por hoy! Incluso si aún no hemos comenzado a hablar de Symfony, hemos configurado un entorno de desarrollo sólido, hemos hablado de las mejores prácticas sobre desarrollo web, y estamos listos para iniciar la programación.

Mañana, vamos a revelar lo que hará la aplicación y conversar sobre los requisitos que necesitamos poner en práctica durante el tutorial.


    Si deseas comprobar el código del día de hoy, o de cualquier otro día, el código esta disponible día a día en el repositorio SVN oficial de Jobeet (http://svn.jobeet.org/doctrine/).

    Por ejemplo, puedes obtener el código de hoy de la etiqueta release_day_01:
Código: c [Seleccionar]

      $ svn co http://svn.jobeet.org/doctrine/tags/release_day_01/ jobeet/



Fuente:http://www.symfony-project.org/jobeet/1_2/Doctrine/es/01
Si has encontrado útil este articulo recuerda que puedes ayudarnos con tu donación voluntaria la cual ayudará al staff y a la mantención del foro.


. . . . . . . .