PHP Patterns – VO & DAO
PHP Patterns – VO & DAO
Como encuentro poca información por internet acerca del patrón de diseño que utilizo yo, voy a relatar la forma de usarlo y por qué lo uso.
Comenzé a utilizar patrones de diseño hace ya unos añitos, cuando alguien me hablo de ellos, o leí en alguna parte que existian, me llamo la atención y quise saber más.
Encontré el patrón VO DAO.
Que significa esto:
1.- VO => Value Objects.
2.- DAO => Data Access Objects.
Creo que todo esto se verá muchísimo mejor con un ejemplo. Vamos con ello.
Imaginemos que tenemos la siguiente estructura en una tabla de nuestra base de datos:
CREATE TABLE `pruebas`.`probando` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`nombre` VARCHAR( 250 ) NOT NULL ,
`Observaciones` VARCHAR( 250 ) NOT NULL ,
`borrado` TINYINT( 1 ) NOT NULL DEFAULT ‘0'
)) ENGINE = InnoDB
Yo tengo el costumbre (no sé si bueno o malo) de tener mi propia clase para la capa de datos.
————————————— Capa de Datos —————————
class dbClass {
public $conexion;
private $server = “localhost”;
private $user = “user”;
private $password = “pass”;
private $database = “pruebas”;
public function getServer(){
return $this->server;
}
public function getUser(){
return $this->user;
}
public function getPassword(){
return $this->password;
}
public function getDB(){
return $this->database;
}
function conecta() {
$this->conexion = mysql_connect ( $this->server, $this->user, $this->password ) or die ( “No se puede establecer la conexión: ” . mysql_error () );
if ($this->conexion != null) {
mysql_select_db ( $this->database );
}
}
function desconecta() {
mysql_close ( $this->conexion );
}
function selectFromSQL($sql) {
$this->conecta ();
$resultado = mysql_query ( $sql, $this->conexion ) or die ( “Error: ” . mysql_error () . ” <br/> ” . $sql );
$this->desconecta ();
return $resultado;
}
function countReg($sql) {
$this->conecta ();
$query = mysql_query ( $sql, $this->conexion ) or die ( “Error: ” . mysql_error () . ” <br/> ” . $sql );
$data = mysql_fetch_array ( $query );
$resultado = $data [0];
$this->desconecta ();
return $resultado;
}
function setReturn($sql) {
$this->conecta ();
$result = mysql_query ( $sql, $this->conexion ) or die ( “Error: ” . mysql_error () . ” <br/> ” . $sql );
$lastId = 0;
if (! $result) {
echo mysql_error ();
die ();
}else{
$sql = “SELECT @@IDENTITY as lastId”;
$ridentity = mysql_query($sql, $this->conexion) or die(”Identity Error: “. mysql_error(). “<br/>”);
if ($ridentity){
$row = mysql_fetch_row ( $ridentity );
$lastId = $row [0];
}
}
return $lastId;
}
function set($sql) {
$this->conecta ();
$result = mysql_query ( $sql, $this->conexion ) or die ( “Error: ” . mysql_error () . ” <br/> ” . $sql );
if (! $result) {
return mysql_error ();
echo mysql_error ();
die ();
}
return true;
}
}
?>
————————-
Una vez tenemos Base de Datos y Clase para trabajar con ella vamos con lo que nos ocupa, los objetos para poder trabajar:
<?php
class probandoVO{
var $Id;
var $Nombre;
var $Observaciones;
var $Borrado;
public function probandoVO($Id = “”, $Nombre= “”, $Observaciones = “”, $Borrado = “0?) {
$this->Id = $Id;
$this->Nombre = $Nombre;
$this->Observaciones = $Observaciones;
$this->Borrado = $Borrado;</span>
<span style="font-size: 8pt; font-family: 'Verdana'; color: #0000ff;">}
}
class probandoDAO {
var $tableName = “probando”;
public function getItem($id) {
$sql = “select * from ” . $tablename . ” where id=” . $id . ” and borrado = 0?;
$data = new dbClass ( );
$result = $data->selectFromSQL ( $sql );
while ( $row = mysql_fetch_array ( $result ) ) {
$item = new probandoVO ( $row ["Id"], $row ["Nombre"], $row ["Observaciones"], $row ["Borrado"] );
return $item;
}
return null;
}
public function get() {
$sql = “select Id, Nombre, Observaciones, Borrado from ” . $tablename . ” where borrado = 0?;
$data = new dbClass ( );
$result = $data->selectFromSQL ( $sql );
$datos = array ();
while ( $row = mysql_fetch_array ( $result ) ) {
$item = new probandoVO ( $row ["Id"], $row ["Nombre"], $row ["Observaciones"], $row ["Borrado"] );
$datos [] = $item;
}
return $datos;
}
public function insert($vo) {
$sql = sprintf ( “insert into ” . $tablename . ” (Nombre, Observaciones, Borrado) values (’%s’, ‘%s’, ‘%s’, ‘%s’)”,
addslashes ( $vo->Nombre ), addslashes ( $vo->Observaciones ), addslashes ( $vo->Borrado ) );
$data = new dbClass ( );
$result = $data->setReturn($sql);
return $result;
}
public function update($vo) {
$sql = sprintf ( “update ” . $tablename . ” set Nombre=’%s’, Observaciones=’%s’, Borrado=’%s’ where id=’%s’”,
addslashes ( $vo->Nombre ), addslashes ( $vo->Observaciones ), addslashes ( $vo->Borrado ), $vo->Id );
$data = new dbClass ( );
$result = $data->set ( $sql );
return $result;
}
}
?>
————————–
Una vez tenemos nuestros objectos creados solo tenemos que trabajar con ellos.
Para pintar:
$dao = new probandoDAO();
$arr = $dato->get();
foreach($arr as $data){
echo “Id: ” . $data->Id;
echo “Nombre: ” . $data->Nombre;
echo “Observaciones: ” . $data->Observaciones;
}
Para guardar, se supone que con un formulario y tal…:
$vo = new probandoVO();
$vo->Id = $_POST["Id"];
$vo->Nombre = $_POST["Nombre"];
$vo->Observaciones = $_POST["Observaciones"];
$dao = new probandoDAO();
if ($vo->Id > 0){
$dao->insert($vo);
}else{
$dao->update($vo);
}
Espero que os sirva de ayuda. Para mí fue un mundo nuevo, sobre todo pensando que lo más dificil de una aplicación es el mantenimiento, y generando todo el código de esta forma es muy sencillo realizar cualquier cambio.
A la hora de guardar los datos, el $vo->Id > 0 se puede introducir dentro del propio objecto.
Para hacer esto sólo hace falta poner como privados los métodos insert y update y crear uno nuevo llamado save que compruebe el Id y realice la opción que corresponsa.
Espero que a alguien le sirva
Buy:Buspar.Cozaar.Lipothin.SleepWell.Prozac.Zetia.Amoxicillin.Benicar.Nymphomax.Female Pink Viagra.Ventolin.Lasix.Lipitor.Female Cialis.Zocor.Aricept.Acomplia.Seroquel.Advair.Wellbutrin SR….