Cómo usar componentes de Zend Framework fuera del MVC

Uno de los caminos para crear una "plataforma de desarrollo" (y bajar costos de desarrollo) es tener unificadas todas las herramientas que usamos a la hora de desarrollar nuestros sistemas.

Por ejemplo, no deberíamos tener distintas clases de acceso a base de datos o generación de logs según el entorno que estemos trabajando (a menos que tengas una razón coherente para hacerlo ;-) ). Si desarrollas dentro de la misma empresa / proyecto tanto sistemas web tradicionales, sistemas de gestión, páginas wap, o aplicaciones de envío SMS (como es en mi caso), no debería haber razón para tener código duplicado.

Una "plataforma" debería servir para eso, tener ya resuelto los problemas triviales y habituales para concentrarnos solo en los problemas nuevos y no triviales.

Una de las grandes ventajas de Zend Framework es poder usar cada uno de sus componentes fuera de la estructura tradicional de MVC, evitando necesariamente tener que usar un controller, modelo y vista. Si ya usas Zend Framework, puedes aprovechar los componentes también de forma aislada, lo que reusas código y conocimiento en el desarrollo de sistemas (aprendes a usar un componente y lo sigues usando en todos los sistemas).

Un caso puntual es poder eliminar todas las clases "artesanales" que hoy día tenemos para la generación de logs y empezar a uzar Zend_Log.

"La forma de hacerlo"

La primera, es instalar en nuestros servidores en un lugar estandarizado las "librerías", como por ejemplo en /var/www/library instalar Zend Framework.

Luego, deberíamos crear un archivo de configuración para que nuestra aplicación pueda encontrar fácilmente los componentes de Zend. Mi sugerencia es que usen la función de "autoload" (Zend_Loader), así no tienen que estar viendo de llamar una a una las clases que necesitan cada uno de los componentes.

config.php


set_include_path
(
'.' .
PATH_SEPARATOR . '/var/www/library' .
PATH_SEPARATOR . get_include_path()
);

include
"Zend/Loader.php";
Zend_Loader::registerAutoload();



Y así incluiríamos ahora la clase Zend_Log en nuestros desarrollos:

test.php

require_once 'config.php';

$writer = new Zend_Log_Writer_Stream('/tmp/test.log');

$logger = new Zend_Log();
$logger->addWriter($writer);

$logger->log('This is a log message!', Zend_Log::INFO);


Listo, ya tenemos un scripts en PHP común y corriente, pero usando ahora un componente del framework Zend.

Así deberíamos poder hacerlo con todos los componentes básicos (base de datos, logs, envío de emails, config, etc), y evitar tener que reinventar la rueda.

¿Te parece útil?

¿Una nueva razón para usar Zend? ¿otros frameworks te permiten hacer lo mismo?

9 comentarios:

Rodrigo Souto dijo...

Yo implemente Zend_Cache en un sitio que no esta desarrollado usando ZF, muy util =)

saludos

Enrique Place dijo...

Que tal Rodrigo ;-)Muy buen dato para tener en cuenta, hay que ir registrando qué casos se pueden y si en algún caso encontramos problemas... aunque la idea de ZF siempre fue que pudieras usar los componentes tanto con el MVC como sin él.

Gracias por el aporte! ;-)

Anónimo dijo...

Hola, he empezado a usar las librerías de Zend fuera de MVC, atraído por la popularidad del framework, la utilidad de algunas de sus librerías y tus inspirados posts aquí y en Foros del Web. Personalmente no soy tan radical en "adorar" a Zend Framework: por ejemplo, la clases Zend_Log no me parece tan sorprendente, si no hace más que añadir un mensaje a un archivo con la fecha y hora y alguna información más... pues eso también lo puedo hacer yo, mi clase Log admite gestión de errores del acceso a datos, usuarios, manejo de los errores PHP... en definitiva, quizá las cosas complicadas es bueno que sean sustituidas por código de otras librerías o frameworks, pero si no ofrecen más funcionalidad, seguridad o eficiencia al programar, no veo motivo para utilizar nuestras propias clases si ya las tenemos.

Enrique Place dijo...

Que tal isra00:> Personalmente no soy tan radical
> en "adorar" a Zend Framework:

No adoro, ya lo he aclarado más de una vez, hablo de lo que conozco, y en este caso en ZF (hace un tiempo hice una encuesta y lo que esperan los usuarios es que hable de estos temas)

> por ejemplo, la clases Zend_Log
> no me parece tan sorprendente,

La idea no es que sea sorprendente, el tema es no tener que reinventar clases para actividades triviales, poder reusarlas o extenderlas, ahorrando tiempo y trabajo (y problemas) si hacemos todo "artesanalmente".

> si no ofrecen más funcionalidad, > seguridad o eficiencia al
> programar, no veo motivo para
> utilizar nuestras propias clases > si ya las tenemos.

¿Evitar implementar funcionalidades triviales y preocuparnos por desarrollar componentes más concretos para nuestro proyecto?

Siempre puedes heredar de la clave base que te ofrece Zend y luego extenderla.

En resumen esa es la estrategia que quiero transmitirles, pensar más como desarrolladores o analistas, integrar componentes existentes y verdaderamente perder tiempo en el desarrollo de lo que "no existe"... el objetivo de nuestro proyecto o lo que nos pide nuestro cliente ;-)

Revisa luego SURFORCE_CORE, que la idea va para ese lado, tener un "core" con lo básico y repetitivo (login, acceso de usuarios, admins, etc) hecho y luego solo agregar módulos de lo que te falta para armar tu sistema.

PD: es lo que hacía el personaje de "La Mosca", no fabricaba componentes, los pedía por separado y luego los unían en algo que los demás no sabían hacer ;-)

Unknown dijo...

Buenos días,

primeramente gracias por el tutorial.
El tuyo es el primero que se acerca a lo que necesito hacer.

Pero sigo con esta duda:
¿Cómo podría hacer una llamada a un controlador desde una aplicación externa?

Gracias de antemano,
Cristian.

Enrique Place dijo...

Que tal Cristian ;-)

Depende un poco lo que quieres hacer y cómo sea la aplicación.

Si solo te importa el resultado (como en el caso de un Ajax), puedes invocar la url, decirle que no haga render y te retorne el dato que esperas y luego lo procesas.

Si es PHP y estás "dentro del sistema", te recomendaría más pensar en reusar componentes desacoplados, como los de Zend. El resto dependerá de cómo hayas hecho tus componentes, pero podrías hacer una librería al igual que Zend, o tal vez pensar en reusar los módulos.

No sé en qué caso te podría servir llamar a un controlador de forma directa (PHP) y cuan conveniente.

Si no te entendí la pregunta, por favor envíame más info ;-)

Unknown dijo...

Buenos días como te va? Intenté seguir este tutorial pero con la última versión de Zend Framework ya el código que está aquí quedo deprecated, sobre todo la parte del autoloader, intenté modificarlo un poco pero a la final sólo recibo pantallas en blanco, a ver si me puedes, por favor, dar una mano o algún otro enlace que explique como usar componentes por separado (en este caso quiero el del email) con la nueva estructura.

Saludos

WANDREW dijo...

Bueno, estando en el 2011 este artículo me ayudó muchísimo, muchas gracias por compartir su conocimiento

pilar dijo...

Hola:
Necesito hacer un calendario utilizando el framework zend , puedes ayudarme con el codigo por favor , estare a la espera de tu respuesta

Entradas populares