viernes, 12 de marzo de 2010

Oracle, Doctrine y Symfony

Después de años de resistirme a PHP, por considerlo un lenguage de scripting, recientemente me vi forzado a involucrarme con el. Después de años de programar en Java, C# y Visual Basic el cambio fue un poco traumático. Sin embargo mi experiencia con Python me ayudo un poco.
En mi busqueda de frameworks que hicieran lo que ya conocia en Java como Hibernate, Struts, etc. Me tropece con Symfony.

Symfony es un Framework basado en el paradigma Model-View-Controller (MVC), es elegante y muy versatil. Sin embargo su curva de apredizaje es mayor que la otros frameworks como por ejempo CodeIgniter. Symfony soporta dos ORMs Doctrine y Propel, decidí trabaja con Doctrine porque encontre la documentación más clara.

La mayoría de los ejemplos que encontré eran usando como RDBMS MySQL, sin embargo no encontré mucho para Oracle y Doctrine. También tuve problemas con las conexiones a Oracle al principio asi que decidi escribir este artículo para tenerlo de referencia en futuras conexiones.

Las tareas de Doctrine no corren desde NetBeans


El primer problema que tuve fue que las tareas de symfony no encontraban el conector oci a pesar que habia editado el php.ini. El problema se debía a que WAMP utiliza dos php.ini uno para Apache (<directorio instalación WAMP>\bin\apache\Apache2.2.11\bin\php.ini) y otro que está en el raiz de la la instalación de php (<directorio instalación WAMP>/bin/php/php5.3.0/php.ini). Cuando trataba de correr las tareas de Doctrine desde Netbeans 6.8 mandaba un error. Una vez active el active el php_oci8.dll en php.ini que se encontraba en el raíz de php el problema se solucionó.

Definición del DSN de Oracle en Symfony

La versión de Oracle con la que estoy trabajando es 10gR2 asi que utilice el conector php_pdo_oci.dll. Aparentemente el php_oci8.dll no es requerido para conectarse con Doctrine.
La sintaxis que me funcionó en el databases.yml fue la siguiente:

all:
doctrine:
class: sfDoctrineDatabase
param:
dsn: oci://[user]:[password]@[server_url]/(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=[server_url])(PORT=1521)))(CONNECT_DATA=(SID=[namespace])))


La información del TNS se encuentra en el archivo tnsame.ora (en mi caso se ecuentra en C:/Oracle/product/10.1.0/Client_1/network/ADMIN/tnsnames.ora).

No hay comentarios:

Publicar un comentario