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;
}
}
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;
}
}
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);
}
}
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);
}
}
Código PHP:
class My_Producto{
private $_nombre;
private $_descripcion;
private $_precio;
public function __construct($nombre = null, $descripcion = null, $precio= null){
$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());
}
}
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);
}
Muchas gracias.