E-commerce con Zend Framework: Introducción

Por zsamer en Febrero 2, 2009

En nuestro primer capitulo de E-commerce con Zend Framework, vamos a resumir un poco de que tratará nuestro sencillo sistema de comercio electrónico y sus componentes. Antes de comenzar quería dar una definición de e-commerce según wikipedia:

"El e-commerce (del anglicismo Electronic Commerce) consiste en comprar y vender productos o servicios a través de sistemas electrónicos como Internet y otras redes computacionales. El intercambio conducido electrónicamente ha crecido de manera espectacular desde la masificación de Internet. Una gran variedad de comercio es conducido de esta manera, estimulando y aprovechando las innovaciones en transferencias financieras, gestión de cadenas de suministros, transacciones en línea, intercambio electrónico de datos (EDI), sistemas de gestión de inventarios, etc. El comercio electrónico moderno usualmente se vale de la WWW (World Wide Web) en algún punto del ciclo de la transacción, aunque puede incluir otras tecnologías como el correo electrónico."

Si aún estas interesado en como implementar un sistema de E-commerce con Zend Framework, entonces continua leyendo.

¿Por dónde empezar?

Esta pregunta es básica a la hora de afrontar un proyecto complejo de desarrollo, sea de la naturaleza que sea. Este tutorial no pretende desarrollar una ingeniería del software, pero sí desmenuzar de una forma directa los pasos a seguir en el desarrollo de nuestra aplicación.

Gracias a la arquitectura MVC, podríamos desarrollar por un lado la interfaz del cliente Web, y delegar en otro equipo de desarrollo la parte de la lógica de negocio. En nuestro caso primero desarrollaremos la parte de negocio, para terminar implementando la capa de presentación y control (más que nada, por claridad en el desglose de los conceptos y su aplicación práctica).

Vamos a comenzar por definir la estructura de nuestros componentes, estos van a quedar dentro de la carpeta Core y a su vez dentro de library, en la misma carpeta de librerías "componentes" donde tenemos Zend Framework.

La siguiente imagen ilustra bien como debe quedar nuestra estructura de directorios:

 

Podemos notar que nuestro sistema consta de un conjunto de clases, seis clases en total organizadas en package (carpetas de componentes).

En la raíz del componente Store tenemos un sub-package Cart y una clase Product. La clase Product representa un prototipo de productos sólo contiene los atributos miembros de la instancia de un objeto del tipo producto y sus respectivos getter/setter, tales como id del producto, nombre, precio, cantidad, detalle etc., más adelante vamos a ver su definición.

El diagrama UML de clases que representa nuestros componentes sería el siguiente:

 

Sub-package Cart

Ahora nos queda describir con un pequeño resumen cada uno de las clases/componentes de nuestro sistema y sus roles:

Abstract (Core_Store_Cart_Abstract): es una clase abstracta que nos dice que debe de hacer nuestras clases que la hereden (clases hijas), nos entregan un contrato de implementación y las clases hijas son las que implementan dicho contrato y nos dicen quienes son y como lo hacen. En otras palabras la clase Abstract definen una colección de métodos abstractos sin implementar los cuales deben de ser implementados por las clases que la hereden, en nuestro caso la clase concreta Cart (carro de compras) debe de definir/implementar los métodos.
El diseño también se podría haber hecho con una interfaz, pero en el ejemplo lo hacemos con clases abstracta ya que además tenemos un método save (guardar en sesión) que deben de heredar todas las clases que la extiendan.

StandardCart (Core_Store_Cart_Abstract_StandardCart): Es nuestra clase concreta de carro de compras, es quien define e implementa los métodos del contrato de la clase abstracta mencionada más arriba. Se ubica dentro del sub-package (directorio de componentes) Abstract dentro de Cart. Además hace uso (Composición) de un objeto de colección de items que veremos más abajo. Además nuestra clase concreta Cart implementa el patrón de diseño singleton(getInstance), única instancia.

Item(Core_Store_Cart_Item): Representa a cada item que ingresamos al carro de compras, es decir serán las líneas de detalle de nuestro carro de compras (Clase Cart). Nuestro objeto Item va a contener al objeto Product (producto) y cantidad del tipo entero que nos indicará el número de cada producto que tenemos almacenado en el carro y nos calculará el importe (P*Q) de cada uno.

Collection (Core_Store_Cart_Item_Collection: Es un objeto que representa una colección de objetos del tipo Item. El objeto de colección (de items) es un atributo/miembro más de la clase CartAbstract, cumple un rol muy importante ya que es quien nos guardara cada uno de los objetos items de nuestro carro de compras. Implementa las interfaces de SPL de PHP5 ArrayAccess, IteratorAggregate, Countable. En otras palabras es el encargado de guardar cada unos de los productos que vallamos agregando al carro de compras.

Factory(Core_Store_Cart_Factory: es nuestra clase abstracta de factoría del carro de compras, que implementa el patrón de diseño Abstract Factory, básicamente lo que hace es verificar si el carro existe en sesión, si es así retorna el objeto Cart guardado en la sesión si no existe en sesión crea el objeto en forma estática mediante el patrón de diseño singleton(getInstance) lo guarda en sesión y luego lo retorna. Por supuesto todo el manejo de sesiones lo vamos a implementar con Zend_Session

La clase Product

A continuación dejo la definición de la clase Product, clase de identidad (identity), que nos representa un prototipo de producto (comúnmente representa la tabla producto de la base de datos como un objeto).

PHP:
  1. <?php
  2. class Core_Store_Product
  3. {
  4.     protected $_id = null;
  5.    
  6.     protected $_name = null;
  7.    
  8.     protected $_description = null;
  9.    
  10.     protected $_detail = null;
  11.    
  12.     protected $_quantity = null;
  13.    
  14.     protected $_price = null;
  15.    
  16.     protected $_dateAdded = null;
  17.    
  18.     protected $_weight = null;
  19.  
  20.     public function __construct($id, $nombre, $description, $price)
  21.     {
  22.         $this->_id = $id;
  23.         $this->_name = $nombre;
  24.         $this->_description = $description;
  25.         $this->_price = $price;
  26.     }
  27.    
  28.     public function getId()
  29.     {
  30.         return $this->_id;
  31.     }
  32.  
  33.     public function setId($value)
  34.     {
  35.         $this->_id =  (int)$value;
  36.     }
  37.    
  38.     public function getName()
  39.     {
  40.         return $this->_name;
  41.     }
  42.  
  43.     public function setName($value)
  44.     {
  45.         $this->_name = $value;
  46.     }
  47.    
  48.     public function getDescription()
  49.     {
  50.         return $this->_description;
  51.     }
  52.  
  53.     public function setDescription($value)
  54.     {
  55.         $this->_description = $value;
  56.     }
  57.  
  58.     public function getDetail()
  59.     {
  60.         return $this->_detail;
  61.     }
  62.  
  63.     public function setDetail($value)
  64.     {
  65.         $this->_detail = $value;
  66.     }
  67.    
  68.     public function getQuantity()
  69.     {
  70.         return $this->_quantity;
  71.     }
  72.  
  73.     public function setQuantity($value)
  74.     {
  75.         $this->_quantity = (int)$value;
  76.     }
  77.  
  78.     public function getPrice()
  79.     {
  80.         return $this->_price;
  81.     }
  82.  
  83.     public function setPrice($value)
  84.     {
  85.         $this->_price = (double)$value;
  86.     }
  87.  
  88.     public function getDateAdded()
  89.     {
  90.         return $this->_dateAdded;
  91.     }
  92.  
  93.     public function setDateAdded($value)
  94.     {
  95.         $this->_dateAdded = $value;
  96.     }
  97.  
  98.     public function getWeight()
  99.     {
  100.         return $this->_weight;
  101.     }
  102.  
  103.     public function setWeight($value)
  104.     {
  105.         $this->_weight = (double)$value;
  106.     }
  107. }

La idea detrás de este tutorial es hacer las cosas lo más simple posible, evitar tener un diseño muy sofisticado para que no se alargue demasiado con tantos componentes (clases/interfaces), ahora, en un ambiente de producción empresarial es recomendable haber hecho un mayor uso de contrato de interfaces y llevar nuestro sistema a un uso mayor de patrones de diseño y orientado a la implementación de interfaces para un diseño más robusto, extensible y reutilizable.

Todo nuestras clases y componentes forman parte de la capa de dominio de nuestro sistema, ya sea dentro del mismo controlador (CartController) o en clases de modelo (service Manager), en otras palabras donde reside nuestra lógica de negocio.

Eso es todo por ahora, estén atentos al próximo capitulo de E-commerce con Zend Framework, veremos la clase de factoría CartFactory.

Espero que sea de utilidad.

Comentarios

6 Responses to “E-commerce con Zend Framework: Introducción”

  1. acido69 on Febrero 3rd, 2009 10:11 am

    Buena iniciativa e interesante tema.

    buen trabajo!!

    :)

  2. Gustavo on Febrero 4th, 2009 12:39 am

    Muy bueno y gracias por el tutorial !

  3. zsamer on Febrero 4th, 2009 12:51 pm

    De nada, yá se vienen más ;-)

  4. E-commerce con Zend Framework: Factoría | Zend Framework: Estado del Arte on Febrero 9th, 2009 9:10 pm

    [...] 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 [...]

  5. Neozeratul on Marzo 2nd, 2009 11:33 am

    Me parece muy bueno tu post, seguire leyendo los demas capitulos, hace unas semanas se me dio por tratar de crear un e-commerce, pero como recien empiezo con esto de ZF, como que me cuesta captar los conceptos y funcionalidades…
    pero manos a la obra!!!
    Aprender algo cada día es bueno!!!

  6. kirochi on Agosto 12th, 2009 6:40 am

    muy buen tuto, oye soy nuevo en esto soy de chile y queria saber si podemos hablar de este framework estoy haciendo mi tesis sn ZF y queria ver si me podiar echa runa manito

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>