Ver Mensaje Individual
  #1 (permalink)  
Antiguo 08/03/2011, 12:52
krikis
 
Fecha de Ingreso: diciembre-2010
Mensajes: 13
Antigüedad: 13 años, 11 meses
Puntos: 0
Zend - MVC - Duda Persistencia / Modelo

Soy principiante en poo, php y Zend, y en mis desarrollos fui probando diferentes formas de hacer las cosas y hoy llegue al punto de no saber cual seria la forma mas adecuada para manejar la persistencia.

Tengo claro que se maneja en el modelo y esta puede ser una bd, un webservice o guardar una imagen en un directorio.

Mi duda es desde donde llamar al modelo y si a los metodos de la clase modelo pesarle variables simples o quizás un objeto.

Pongo un ejemplo básico con las posibles formas que encuentro de hacerlo.

Desde que aprendí poo todo es un objeto, por ejemplo si en mi web voy a tratar con productos creo mi clase Producto con sus atributos "Nombre" "descripcion" "precio" etc, ahora bien necesito que esos productos se persistan en una BD y también necesito luego poder recuperarlos de la persistencia.

Desde mi controlador hago la instancia de un objeto producto y a traves de metodos set o desde el constructor cargo el (nombre descripcion y precio), obtenidos seguramente desde un formulario. Bien llego la hora de persistir este producto en la BD y tengo las siguientes opciones:

OPCION[1] Desde el controlador instancio la clase del modelo Productos y llamo al metodo "save" y le paso los parametros ($nombre,$descripcion,$precio).

Clase del Modelo
Código PHP:
class Application_Model_DbTable_Productos extends Zend_Db_Table_Abstract
{
    protected 
$_name 'productos';

     public function 
save($nombre,$descripcion,$precio){  
        
$data = array('nombre'=> $nombre'descripcion' => $descripcion'precio' => $precio);
        
$this->insert($data);
    }
    public function 
search($nombre){  
        
$where $this->select()->where('nombre LIKE %?%'$nombre);
        
$rows $this->fetchAll($where);
    return 
$rows;
    }

Controlador
Código PHP:
public function nuevoAction(){
   
$params $this->getRequest()->getPost();
   
$producto = new My_Producto($params['nombre'],$params['descripcion'],$params['precio'] );

   
$modeloProducto = new Application_Model_DbTable_Productos;              
   
$modeloProducto->save($params['nombre'],$params['descripcion'],$params['precio']);
   
//O 
   
$modeloProducto->save($producto->getNombre(),$producto->getDescripcion(),$producto->getPrecio());
 }
//Luego si quisiera buscar productos con x nombre en la persistencia
public function searchAction(){
   
$params $this->getRequest()->getPost();               
   
$modeloProducto = new Application_Model_DbTable_Productos;
   
$rows $modeloProducto->search($params['nombre']);

   foreach(
$rows as $row){
   
$producto = new My_Producto($row->nombre,$row->descripcion,$row->precio);
   
$colProductos[] = $producto;
   }                       

OPCION[2] Desde el controlador instancio la clase del modelo Productos y llamo al metodo "save" y le paso directamente el objeto Producto

Clase del Modelo
Código PHP:
class Application_Model_DbTable_Productos extends Zend_Db_Table_Abstract
{
    protected 
$_name 'productos';
     public function 
save(My_Producto $producto){  
        
$data = array('nombre'=> $producto->getNombre(), 'descripcion' => $producto->getDescripcion(), 'precio' => $producto->getPrecio());
        
$this->insert($data);
    }

Controlador
Código PHP:
public function nuevoAction(){
   
$params $this->getRequest()->getPost();
   
$producto = new My_Producto($params['nombre'],$params['descripcion'],$params['precio'] );
   
$modeloProducto = new Application_Model_DbTable_Productos;             
   
$modeloProducto->save($producto);
 } 

OPCION[3] Desde el Controlador instancio el objeto Producto y desde un metodo del producto llamo al modelo para hacer la persistencia

En este caso encuentro dos variantes,
A) EL metodo salvarProducto() de la clase My_Producto ya tiene definida la clase sobre la que hara la persistencia
B) El metodo salvarProductoDos() de la clase My_Producto recibe la clase sobre la que se hara la persistencia cumpliendo siempre con una Interfaz

Clase del Modelo (Ubicada en library/My/Producto/DataSource/ZendDB.php
Código PHP:
class My_Producto_DataSource_ZendDB extends Zend_Db_Table_Abstract implements My_Producto_DataSource_Interfaz
{
    protected 
$_name 'productos';
     public function 
save($nombre,$descripcion,$precio){  
        
$data = array('nombre'=> $nombre'descripcion' => $descripcion'precio' => $precio);
        
$this->insert($data);
    }

Clase Producto
Código PHP:

class My_Producto{

   private 
$_nombre;
   private 
$_descripcion;
   private 
$_precio;

 public function 
__construct($nombre null$descripcion null,  $precionull){
   
$this->_nombre $nombre;
   
$this->_descripcion $descripcion;
   
$this->_precio $precio;
 }

 public function 
salvarProducto(){
   
$modeloProducto = new Application_Model_DbTable_Productos;             
   
$modeloProducto->save($this->getNombre(),$this->getDescripcion(),$this->getPrecio());
 }
 
 public function 
salvarProductoDos(My_Producto_DataSource_Interfaz $dataSource ){ 
   
$dataSource->save($this->getNombre(),$this->getDescripcion(),$this->getPrecio());
 }


Controlador
Código PHP:
public function nuevoAction(){
   
$params $this->getRequest()->getPost();
   
$producto = new My_Producto($params['nombre'],$params['descripcion'],$params['precio'] );
   
$producto->salvarProducto();
   
//O...
   
$producto->salvarProductoDos(new Application_Model_DbTable_Productos);
 } 
Espero puedan brindarme a traves de sus conociemientos y expereciencia cual creen que seria la forma mas correcta o bien si ninguna de estas formas es correcta cual seria.
Muchas gracias.