viernes, 14 de noviembre de 2008

CodeIgniter ♥ Doctrine

Este es el paso por paso para integrar Doctrine y CodeIgniter de manera elegante, es decir, sin hackear el core.

Paso 1: Descargar doctrine


Puede parecer trivial, pero es importante.
En la página de descargas de Doctrine, hay para todos los gustos.
Una vez descargados los archivos sólo se necesita, por ahora, el contenido de la carpeta lib.
En este tutorial se asume que el contenido de lib es guardado en [DocumentRoot]/system/doctrine

Paso 2: Configuración


Para mantener el feeling the CodeIgniter, opté por crear un archivo doctrine.php dentro de [DocumentRoot]/system/application/config

Contenido de [DocumentRoot]/system/application/config/doctrine.php
<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

$config['doctrine_path'] = BASEPATH . DIRECTORY_SEPARATOR . 'doctrine' . DIRECTORY_SEPARATOR . 'Doctrine.php';
$config['data_fixtures_path'] = APPPATH .DIRECTORY_SEPARATOR .'data' . DIRECTORY_SEPARATOR . 'fixtures';
$config['models_path'] = APPPATH .DIRECTORY_SEPARATOR . 'models';
$config['migrations_path'] = APPPATH .DIRECTORY_SEPARATOR .'migrations';
$config['sql_path'] = APPPATH .DIRECTORY_SEPARATOR .'data' . DIRECTORY_SEPARATOR . 'sql';
$config['yaml_schema_path'] = APPPATH .DIRECTORY_SEPARATOR .'yaml';

?>


Nótese que uso las constantes BASEPATH y APPATH que provee CodeIgniter, para que, en caso de alguna personalización de la configuración, este sistema siga siendo compatible.

Lo siguiente es crear las carpetas pertinentes. Yo opté por colocarlas dentro de la carpeta application que es donde coloco todo aquello sobre lo que trabajo. Algunos podrían preferir colocarlas al nivel de system o completamente fuera de CI. Si lo hacen deben editar config/doctrine.php

Las siguientes carpetas deben ser creadas:
  • [DocumentRoot]/system/application/data

  • [DocumentRoot]/system/application/data/fixtures

  • [DocumentRoot]/system/application/data/sql

  • [DocumentRoot]/system/application/migrations

  • [DocumentRoot]/system/application/schema


Para la configuración de base de datos vamos a compartir la de CodeIgniter

Paso 3: Integración con CodeIgniter


En este punto me pareció importante tener control sobre la inicialización de Doctrine, al igual que CI provee control sobre la inicialización de la base de datos. Jugué un poco con la idea de que fuera una Library, pero finalmente opté por cargarlo como un plugin.
Para ello creé un archivo en [DocumentRoot]/system/application/plugins llamado doctrine_pi.php

<?php

// Incluyo la config
include APPPATH . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'doctrine' . EXT;
include APPPATH . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'database' . EXT;

require_once $config['doctrine_path'];

// Inicializo el
spl_autoload_register(array('Doctrine', 'autoload'));

// Cargo la conexion de Base de Datos

$doctrine_group = $active_group;
//$doctrine_group = 'doctrine_custom_group';

$dsn = $db[$doctrine_group]['dbdriver'] .
'://' . $db[$doctrine_group]['username'] .
':' . $db[$doctrine_group]['password'].
'@' . $db[$doctrine_group]['hostname'] .
'/' . $db[$doctrine_group]['database'];


Doctrine_Manager::connection($dsn);

// Cargo los modelos
Doctrine::loadModels($config['models_path'], Doctrine::MODEL_LOADING_CONSERVATIVE);
?>


Paso 4 - Uso



Hasta aca ya quedo instalado Doctrine en CodeIgniter. Para usarlo sólo hace falta inicializar el plugin desde el controlador

<?
class Test extends Controller {
public function index() {
$this->load->plugin("doctrine");
}
}



La próxima, implementación de la consola de Doctrine para unix y windows integrada con CodeIgniter

2 comentarios:

  1. Genial el tutorial. Copiado casi al dedillo y funciona.
    Una sola salvedad:
    en el Paso 4 - Uso
    le falta una 't'
    $this->load->plugin("docrine");


    Saludos!

    ResponderEliminar
  2. gracias lo probare, ojala que funcione, lo estaba necesaitando

    ResponderEliminar