Diseño OO (Diagrama de Clases UML) y Symfony

434 views
Skip to first unread message

NikY

unread,
Sep 13, 2007, 10:08:07 AM9/13/07
to symfony-es
Hola a todos:

Soy nueva en Symfony y tengo una graaaaaaaaaan duda:
"Symfony" un framework que agiliza el desarrollo de aplicaciones web,
trabaja con patron MVC y posee un ORM que transforma el modelo de
datos a modelo de clases, facilitando el trabajo (abstrayendo...).

Y es aquí mi pregunta: Si trabajo con RUP (naturalmente asociado con
UML y el diseño orientado a objetos): ¿Como puedo traducir todo el
analisis y diseño (oo) que haga a partir de UML- RUP y plasmarlo en
symfony?
Me explico, en diseño oo se crean clases, diagramas de interaccion, de
paquetes, tambien diseñamos pantallas y hacemos un modelo de datos.
No necesariamente, las clases diseñadas tienen una correspondencia 1 a
1 con las tablas de la base de datos (relacional), por ejemplo: una
clase boleta puede tener los atributos numero de boleta y fecha y un
arreglo de productos, lo que en la base de datos puede estar reflejado
como una tabla "Boleta" que contenga los campos: id_boleta,
numero_Boleta, fecha_boleta y otra tabla "detalleBoleta" que
contenga los campos: id_detalleBoleta, fk_id_Boleta,
NombreProducto (listado de productos asociado a cada boleta).

Como vemos no necesariamente el modelo de clases que podemos obtener
despues de analisis y diseño orientado a objetos, sera coincidente con
el modelo de la BD, pero lo que hace Symfony es por cada tabla de la
BD crear una clase ( que en el ejemplo seria la clase sfBoleta y la
clase sfDetalleBoleta, lo cual no coincidiria con mi diseño oo que
tendria solo la clase Boleta)

Entonces, ¿como que si hago mi diseño oo, no va a coincidir con las
clases que me genere symfony?
Si la repuesta fuese: No, no coincidiran... se podria decir que
symfony es orientado a eventos, ya que no tenemos un diseño de objetos
previo?

Pls SOS SOS

Les agradezco de antemano su ayuda :D

salu2

Niky

Sergio Flores

unread,
Sep 13, 2007, 2:41:05 PM9/13/07
to symfo...@googlegroups.com
Hola NikY:

Está bien que existan dos clases, Boleta y DetalleBoleta.

Sólo te queda configurar tu capa ORM (Propel o Doctrine (te lo
rocomiendo)) para que Boleta esté compuesto por muchos DetalleBoleta, y
ahí tenes tu "array".

Por ejemplo, en Doctrine tendriamos las dos clases cofiguradas así:

class Boleta extends Doctrine_Record
{
public function setTableDefinition()
{
$this->hasColumn('numero', 'integer');
$this->hasColumn('fecha', 'date');
}

public function setUp()
{
$this->ownsMany('DetalleBoleta as Detalles',
'DetalleBoleta.boleta_id');
}

public function getTotal()
{
$acum = 0;
foreach($this->getDetalles() as $detalle) {
$acum += $detalle->getTotal();
}
return $acum;
}
}

class DetalleBoleta extends Doctrine_Record
{
public function setTableDefinition()
{
$this->hasColumn('boleta_id', 'integer');
$this->hasColumn('producto_id', 'integer');
$this->hasColumn('cantidad', 'integer');
$this->hasColumn('precio', 'integer');
}

public function setUp()
{
$this->hasOne('Boleta', 'DetalleBoleta.boleta_id');
$this->hasOne('Producto', 'DetalleBoleta.producto_id');
}

public function getTotal()
{
return $this->getCantidad() * $this->getPrecio();
}
}

class Producto extends Doctrine_Record
{
public function setTableDefinition()
{
$this->hasColumn('nombre', 'string', 100);
}
}


Entonces..., al usar tu modelo podria ser algo así:

// Alta

$boleta = new Boleta();
$boletaNumero = $this->getRequestParameter('boleta_numero');
$productosComprados =
sfDoctrine::getTable('Producto')->find($this->getRequestParameter('productos'));
$productosCantidades = $this->getRequestParameter('cantidades');


$boleta->setNumero($boletaNumero);
$boleta->setFecha(date());

foreach($productosComprados as $producto) {
$detalle = new BoletaDetalle();
$detalle->setProducto($producto);
$detalle->setCantidad($productosCantidades[$producto->getId()]);
...
$boleta->Detalles[] = $detalle;
}

$boleta->save();

// Ver boleta

# En la acción:

public function executeVer()
{
$boleta =
sfDoctrine::getTable('Boleta')->find($this->getRequestParameter('id'));
$this->forward404Unless($boleta);
}

# En la vista

<h2><?php echo $boleta->getNumero() ?> - <?php echo $boleta->getFecha()
?></h2>

<table>
<caption>Detalle de boleta</caption>

<thead>
<tr>
<th>Cantidad</th>
<th>Producto</th>
<th>Precio Unitario</th>
<th>Total</th>
</tr>
</thead>

<tfoot>
<tr>
<th colspan="3">Total de la boleta</th>
<td>$ <?php echo $boleta->getTotal() // se puede usar
format_number() aqui ?></td>
</tr>
</tfoot>

<tbody>
<?php foreach($boleta->getDetalles() as $detalle): ?>
<tr>
<td><?php echo $boleta->getCantidad() ?></td>
<td><?php echo $boleta->getProducto()->getNombre() ?></td>
<td><?php echo $boleta->getPrecio() ?></td>
<td><?php echo $boleta->getTotal() ?></td>
</tr>
<?php endforeach ?>
</tbody>

</table>

Espero haya servido de algo..., no sé si es realmente lo que buscas...,
pero es cómodo y ni documentación le hace falta por lo "natural".

Saludos!


NikY escribió:

Marc Torres

unread,
Sep 14, 2007, 7:33:18 AM9/14/07
to symfo...@googlegroups.com
Hola NikY,

Cómo sabes, para el acceso a datos (ORM), Symfony usa el proyecto independiente propel. Sergi ya te ha comentado que con Doctrine (otro ORM disponible), puedes hacerlo. Pues también se puede hacer usando propel. Te dejo el link para que veas como se hace con propel:

http://propel.phpdb.org/docs/es/user_guide/chapters/AdvancedObjectModel.html

Saludos,

Marc.

2007/9/13, NikY <nikyt...@hotmail.com>:



--
"I'm unique, just like everyone else". Read it out there

NikY

unread,
Sep 14, 2007, 12:37:44 PM9/14/07
to symfony-es
Hola =)

Muchas gracias a ambos por responderme, y aclararme la duda... eso de
configurar la capa ORM sonó muy interesante....
Voy a ver que sale.. grax... estaba super complicada con mi oo y lo
que hacia symfony

saludines to2

Niky

Roberto Carvajal

unread,
Sep 17, 2007, 12:51:23 PM9/17/07
to symfo...@googlegroups.com
Reply all
Reply to author
Forward
0 new messages