Monday 23 September 2013

Symfony 2.3 para impacientes

Una empresa me pide que le actualice su intranet del 2002. Es una empresa mediana, sin mucho soporte, ponerles Ruby On Rails les elevaría mucho los costos. Aquí PHP es buena opción. Como ya conozco CakePHP al derecho y al revés me parece que es una buena oportunidad de echarle ojo a Symfony. Como soy mexicano, valiente y bragao, uso Emacs y PostgreSQL para evitar de Vim y MySQL. ;-)

Aquí se los resumo pués:

1) Instalar composer:

$curl -sS https://getcomposer.org/installer | php

2) Ejecutar:

$ php ./composer.phar create-project symfony/framework-standard-edition intranet 2.3.1

database_driver (pdo_mysql):pdo_pgsql
database_host (127.0.0.1):
database_port (null):5432
database_name (symfony):DBSYMFONY
database_user (root):postgres
database_password (null):*********
mailer_transport (smtp):
mailer_host (127.0.0.1):
mailer_user (null):
mailer_password (null):
locale (en):
secret (ThisTokenIsNotSoSecretChangeIt):

3) Una checadita:

$ php app/check.php

4) En una nueva consola de tmux corremos el the built-in web server:

$ php app/console server:run

5) Browser:

http://localhost:8000/config.php

6)creamos la DB:

$ php app/console doctrine:database:create

7) Los bundles son las pequeñas "apps" con las que está construido nuestro proyecto web, son como las apps de Django. Esta modularización es un plus de este framework. Symfony usa los NameSpaces de PHP 5.4, de este modo el nombre de los name spaces en los bundles sigue este criterio: NombreDeLaEmpresa/NombreDelProyecto/NombreDelModelo. Asi pues creamos nuestro primer bundle:

$ php app/console generate:bundle --namespace=GCP/Intranet/ImagesBundle --no-interaction --dir=./src --format=yml

OJOOOO!!!: Symfony soporta diferentes tipos de formatos en la configuración de los bundles (php, yaml, xml, annotation) pero no soporta mezclas entre ellos, los bundles deben ser todos con el mismo formato.

8) Ahora creamos una entity de Doctrine, en Ruby On Rails sería algo así como:

$rails g scaffold Image file:string tags:string user_id:integer

En Symfony:

$php app/console generate:doctrine:entity --entity=GCPIntranetImagesBundle:Image --format=yml --fields="file:string(100) tags:string(255) user_id:integer"

La columna "id serial" de PostgreSQL, Doctrine la crea por default y no es necesario ponerla.

9) Ahora queremos el CRUD para este modelo:

$php app/console generate:doctrine:crud --entity=GCPIntranetImagesBundle:Image --format=yml --with-write --no-interaction

10) Ahora hacemos la migración de la entity de Doctrine a PostgreSQL:

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

Entiendo a los que les gusta Symfony, y supongo que entre más se usa, más se le toma gusto. Pero al principio la configuración de tantos archivos puede resultar tediosa pues por alguna razón el exitosísimo princpio "convención sobre configuración" brilla por su ausencia en Symfony.