Ding en php (IoC,DI,AOP, MVC)

Ya tiene un buen rato que no tocaba algo en php y ahora que tengo que retomarlo he tratado de aplicar las buenas practicas de desarrollo que he aprendido. Y una de ellas en la programación orientada a objetos es la famosa inversión de control y la inyección de dependencias, de la cual ya he descrito brevemente con el uso de Spring.

En Java la POO es el pan de cada día, y PHP ya soporta algunas de las características a partir de su versión 5, sin embargo me sorprende ver que no es tan adoptada por los desarrolladores en php, si buscas ejemplos en internet de código aparecen muchos de forma estructurada, que si bien son muy buenos pero no se aprovechan las características de la POO.

Y a mi parecer la comunidad de php no adopta este estilo porque es un poco más difícil de integrar, ya que no es un leguaje con datos tipificados, al contrario, brinda mucha flexibilidad pero ese es su principal problema ya que las personas que desarrollan prefieren hacer las cosas de forma estructurada (por simplesa y rápidez)  en lugar de hacer dos o más clases para encapsular los objectos y luego programar su interacción.

En fin yo llevo algunos años en Java y ahora que tomo php noto las diferencias y carencias que tiene con la orientación a objetos, por ejemplo es suceptible a la inyección de código, no cuenta con un log personalizado por aplicación (se puede, pero hay que configurarlo), puede sufrir inyección de sql si no se programa bien, le falta algún framework para manejar persistencia (tiene pocos pero necesitan sintaxis nativa), su sistema de plantillas (smarty, sigma, cakephp) mmm… ps que puedo decir, eran dependientes y no son lo que esperaba, etc… pero bueno no quiero que piensen que estoy en contra de PHP, al contrario tiene muchas cosas muy buenas pero hay que saber cuidarlas.

Bueno regresando al tema de la POO, Ding es el equivalente de Spring en Java y principalmente me llama la atención porque te ayuda a desacoplar el código, manejar características como AOP, manejo de excepciones etc…

Este es el portal oficial http://marcelog.github.com/Ding/, falta algo de documentación pero si conoces de Spring rápidamente podras adaptarte.

Instalación:

1. Se puede realizar manualmente o a través de PEAR (aquí lo voy a hacer con PEAR):

sudo pear channel-discover pear.marcelog.name
sudo pear install marcelog/Ding-1.1.0

Nota: en la portal aparece la versión 1.0.0 pero tu tienes que cambiarla por la versión actual, puedes verificarlo con el comando pear remote-list -c marcelog.

2. Ding necesita del módulo de APC para manejar el cache en php:

Linux (Ubuntu)

sudo apt-get install apache2-threaded-dev php5-dev php-pear make

Si utilizas el servidor apache necesitas crear un enlace simbolico:

ln -s /usr/bin/apxs2 /usr/bin/apxs

Ahora instalas el módulo:

sudo pecl install apc

Al final de te debe de aparecer algo como esto:

Build process completed successfully
Installing '/usr/include/php5/ext/apc/apc_serializer.h'
Installing '/usr/lib/php5/20090626/apc.so'
install ok: channel://pecl.php.net/APC-3.1.9
configuration option "php_ini" is not set to php.ini location
You should add "extension=apc.so" to php.ini

Editas el archivo php.ini (/etc/php5/apache2/php.ini  o /etc/php5/apache2filter/php.ini) y agregas :

extension=apc.so

Reinicias tu servidor apache y creas una página con la función phpinfo(); deberias ver el módulo activado (Figura 1.0)

sudo apachectl restart

Mac OSX (Lion)

Ejecutas los siguientes comandos:

brew install pcre
sudo pecl install apc-3.1.6

Y agregas la extensión a tu php.ini (/etc/php.ini):

extension=apc.so

Reinicias tu servidor apache y  si abres una pagina con la función phpinfo(); deberias ver el módulo activado:

sudo apachectl restart

Figura 1.0 Módulo APC activado en php (Ubuntu linux)

3. Instalas log4php y phpunit:

Lo malo de Ding es la documentación ya que es poca o nula, sin embargo en el portal puedes descargar el zip del framework con unos ejemplos muy útiles, para que funcionen necesitas estos dos frameworks:

PHPUnit

sudo pear channel-discover pear.phpunit.de
sudo pear config-set auto_discover 1
sudo pear install phpunit/PHPUnit

Log4php

sudo pear channel-discover pear.apache.org/log4php
sudo pear install log4php/Apache_log4php

Descomprimes el zip en tu directorio /var/www/ e ingresas a la carpeta ding/docs/examples/basic

Si ejecutas el archivo http://localhost/ding/docs/examples/basic/example.php desde el navegador no va a funcionar, te va a salir un error como este:

PHP Fatal error: Class 'Logger' not found in /var/www/ding/src/mg/Ding/Container/Impl/ContainerImpl.php on line 482

Editas el archivo example.php y vamos a indicarle donde esta la clase Logger:

require_once 'log4php/Logger.php';

Y listo ya puedes ejecutar el ejemplo http://localhost/ding/docs/examples/basic/example.php:

Como nota adicional, cuidado con la configuración del contenedor, ya que por defecto siempre esta apuntando al cache, si tu modificas algo en el beans.xml no vas a ver el cambio hasta que reconfigures el cache del APC, o en su defecto quitas las lineas de configuración pero no aprovecharias al APC, yo recomiendo quitarlas mientras estas en desarrollo y al subir al server las activas.

Referencias:

http://marcelog.github.com/Ding
http://www.phpunit.de/manual/3.6/en/index.html
http://logging.apache.org/log4php/

http://www.pcfrikis.com/2010/01/11/apc-y-la-cache-de-usuario/
http://i.justrealized.com/2010/install-php-apc-mac-os/
http://www.newmediacampaigns.com/page/install-pear-phpunit-xdebug-on-macosx-snow-leopard

Saludos

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s