Más con Symfony

13.4. Accediendo a la base de datos

Acceder a la base de datos desde una tarea de Symfony es algo tan sencillo como crear una instancia de la clase sfDatabaseManager:

public function execute($arguments = array(), $options = array())
{
  $databaseManager = new sfDatabaseManager($this->configuration);
}

También se puede acceder directamente al objeto de la conexión del ORM:

public function execute($arguments = array(), $options = array())
{
  $databaseManager = new sfDatabaseManager($this->configuration);
  $connection = $databaseManager->getDatabase()->getConnection();
}

¿Qué sucede si se dispone de varias conexiones definidas en el archivo databases.yml? En este caso se puede añadir en la tarea una opción llamada connection:

public function configure()
{
  $this->addOption('connection', sfCommandOption::PARAMETER_REQUIRED, 'The connection name', 'doctrine');
}

public function execute($arguments = array(), $options = array())
{
  $databaseManager = new sfDatabaseManager($this->configuration);
  $connection = $databaseManager->getDatabase(isset($options['connection']) ? $options['connection'] : null)->getConnection();
}

Como es evidente, esta opción de conexión puede tener un valor por defecto de forma que no se obligue a indicarlo cada vez que se ejecuta la tarea. Utilizando solamente el código anterior ya es posible manipular los modelos de datos como si estuvieras dentro de una aplicación de Symfony.

Nota Si la tarea procesa muchos objetos del ORM, debes tener en cuenta que tanto Propel como Doctrine sufren un error de PHP muy conocido relacionado con las referencias cíclicas y el recolector de basura que provoca consumos masivos de memoria. Este error se ha corregido parcialmente en PHP 5.3.