6 de julio de 2010
Bueno, llevo unos 3 meses trabajando con la versión 1.4 de Symfony y el ORM Doctrine. Anteriormente estuve un par de años trabajando con la version 1.0 y Propel.
El cambio a la hora de codificar es significativo, no puedo comentar nada nuevo que no se haya comentado ya al respecto de las novedades de estas versiones sobre la 1.0.
En mi caso, la integración con el subframework de formularios aun continua su proceso, me manejo mucho mejor que al principio, pero aun hay muchos aspectos que desconozco.
El sistema de enrutamiento lo veo muy cómodo, ya que permite establecer en el routing.yml los parámetros del objeto que vas a pasar por URL de modo que a la hora de llamar al helper link_to, solo con pasarle el objeto completo, éste ya se encarga de formatear la URL. Además con los comportamientos (behaviors) de Doctrine, también se pueden definir Slug de forma muy sencilla.
Ejemplo:
routing.yml
watch_show:
url: /catalogo/:brand_url/:slug
class: sfDoctrineRoute
options: { model: Watch, type: object }
param: { module: watch, action: show }
requirements:
id: \d+
sf_method: [get]
showSuccess.php
url_for('watch_show', $principalWatch)
lib/model/doctrine/Watch.class.php
public function getBrandUrl()
{
return $this->getBrand()->getSlug();
}
schema.yml
Watch:
tableName: watch
actAs:
Timestampable: ~
Sluggable:
unique: true
fields: [model_name]
canUpdate: true
apps/frontend/modules/watch/actions/actions.class.php
public function executeShow(sfWebRequest $request)
{
// 'watch_show'
$this->watch = $this->getRoute()->getObject();
}
Otro de los cambios importantes es el paso a Doctrine como ORM en defecto de Propel. Lo noto muy flexible, fácil de aprender pero por completo diferente a Propel. Los retrieves se hacen en base a la clase Doctrine_Query y vas formando query de una forma mucho más gráfica y no tan complejas como con Criteria de Propel.
Ejemplo de Query:
$q = Doctrine::getTable('Articulos')->createQuery('a')
->leftJoin('a.Familias f')
->leftJoin('a.Subfamilias sf')
->innerJoin('a.fotos ft')
->where('a.pagarias = ?',false)
->andWhere('a.agotado = ?', false)
->andWhere('a.familia = f.id')
->orderBy('a.portada DESC')
->limit(23)
;
Doctrine cuenta con una tabla que modela el objeto en si "Articulos" (en este ejemplo) y con una clase destinada a las operaciones de consulta a la tabla "ArticulosTable" (siguiendo con el ejemplo).
Existen muchas más cosas a tener en cuenta. Por lo que es recomendable leer las novedades de cada versión con el fin de tener en mente las nuevas funcionalidades que aporta cada versión de Symfony.
Yo acabo de pedir el libro Más con Symfony que está destinado a los programadores que conocen bien el entorno y quieren ser aun más productivos con Symfony.
Tags: Programación | PHP | Symfony