E-commerce con Zend Framework: Factoría

Por zsamer en Febrero 9, 2009

En el capitulo anterior "E-commerce con Zend Framework: Introducción" como el nombre lo dice, hicimos una introducción al desarrollo y diseño de un sistema de E-commerce con Zend Framework y describimos cada uno de sus componentes y funciones dentro de la aplicación. En esta oportunidad vamos a ver la función de la clase de factoría: CartFactory.

Antes de entrar en lleno a nuestra clase factory, veamos en que consiste el patrón de diseño que la implementa. El patrón de diseño involucrado es el llamado Factory Method.

Bueno y ¿Qué es un patrón de diseño?

En la ingeniería de software, existe algo fundamental para el diseño y buenas practicas en la programación orientada a objetos "Los patrones de diseños". Estos se definen como la mejor solución a un problema recurrente y común en el desarrollo de software en un contexto determinado y van de la mano con su representación en diagramas UML.

En el patrón de diseño Factory Method está compuesta al menos por dos clases que son fundamentales, y estas son el creador y el producto.

El patrón de diseño Factory en simples palabras es una fabrica de objetos, nos crea el objeto que deseamos tener y lo retorna para su uso, toda la implementación se concentra en una clase, comúnmente llamada Factory (clase de factoría o fabrica), en otras palabras es una clase constructora de objetos de un determinado tipo.

Nuestra clase Factory CartFactory

PHP:
  1. <?php
  2. Zend_Loader::loadClass('Zend_Session_Namespace');
  3. Zend_Loader::loadClass('Core_Store_Cart_Abstract');
  4.  
  5. abstract class Core_Store_Cart_Factory
  6. {
  7.     const ADAPTER_NAMESPACE = 'Core_Store_Cart_Abstract_';
  8.    
  9.     static public function createInstance($adapterName)
  10.     {
  11.         if (!is_string($adapterName) || !strlen($adapterName)) {
  12.             throw new Exception('Adapter Cart name must be specified in a string');
  13.         }
  14.  
  15.         $classEngine = self::ADAPTER_NAMESPACE . $adapterName;
  16.         Zend_Loader::loadClass($classEngine);
  17.        
  18.         if(Zend_Registry::isRegistered('coreSession')){
  19.             $sessionData = Zend_Registry::get('coreSession');
  20.         } else {
  21.             $sessionData = new Zend_Session_Namespace('coreSession');
  22.             Zend_Registry::set('coreSession', $sessionData);
  23.         }
  24.                
  25.         if(isset($sessionData->cart) && ($sessionData->cart !== null) ){
  26.             $cartObject = $sessionData->cart;
  27.         } else {
  28.             if (class_exists($classEngine, false)) {
  29.                 $cartObject = call_user_func(array($classEngine, 'getInstance'));
  30.             } else {
  31.                 throw new Exception ("Adapter '$classEngine' not found");
  32.             }
  33.  
  34.             $sessionData->cart = $cartObject;
  35.         }
  36.        
  37.         if(! $cartObject instanceof Core_Store_Cart_Abstract){
  38.             throw new Exception("Adapter class '$classEngine' does not extend Core_Store_Cart_Abstract");
  39.         }
  40.         return $cartObject;
  41.     }
  42. }

En el código de arriba, nuestra clase abstracta de factoría, contiene un solo método estático createInstance($adapterName), recibe por argumento un String que contiene en nombre del adaptador de Cart, que representa el nombre de la clase concreta StandardCart (Cart) a crear. La clase concreta StandardCart corresponde a la clase producto (el producto a fabricar/crear) en el patrón de diseño Factory y la clase CartFactory es nuestra clase creadora o fabricadora de Cart.

La implementación dentro del método createInstance suceden cosas bien interesantes, como nuestra carro de compras funciona en un scope de sesión (ámbito de sesión) es necesario crear y usar sesiones, entonces lo primero que hacemos es preguntar si existe una instancias del componente de sesión de Zend Framework: Zend_Session y si no existe creamos una con el nombre "coreSession" y la guardamos en el Registro (Zend_Registry) de nuestro sistema.

Después comprobamos si existe la variable de sesión "cart" y si el valor almacenado en la sesión es distinto de null y si corresponde al tipo de dato/objeto "Core_Store_Cart_Abstract", si es así entonces retornamos el objeto carro de compras guardado en sesión, si no existe se crea la instancia singleton del carro de compras y se guarda en la sesión y lo retorna.

Como vemos hemos hecho uso de varios componentes de Zend Framework, entre ellos: Zend_Session y Zend_Registry.

Bueno espero que haya sido un interesante articulo y nos vemos en el próximo capitulo, que va a estar muy bueno, vamos a ver la clase carro de compras Core_Store_Cart_Abstract_StandardCart y su clase padre Core_Store_Cart_Abstract.

:-)

Comentarios

2 Responses to “E-commerce con Zend Framework: Factoría”

  1. Enlaces del 10-02-09 | evelio.info on Febrero 10th, 2009 7:08 am

    [...] E-commerce con Zend Framework: Factoría por zsamer [...]

  2. E-commerce con Zend Framework: Clase Cart | Zend Framework: Estado del Arte on Febrero 23rd, 2009 3:01 pm

    [...] el capitulo anterior “E-commerce con Zend Framework: Factoría” hablamos sobre el componente/clase Factoría que nos resolvía el problema de obtener el objeto [...]

Deja tu comentario




XHTML: puedes usar estas etiquetas: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>