Sobre la separecion en capas , donde va que cosa, opinen y digamenn como lo hacen ustedes

10 views
Skip to first unread message

Nixs

unread,
Jun 22, 2009, 4:31:19 PM6/22/09
to symfony-es
Saludos compañeros de Symfony. Estoy por desarrollar mi segunda
aplicacion de symfony pero me gustaria aclarar algunas dudas sobre
donde debes estar hubicado el codigo, en cada capa.

Por empezar Symfony es una framework MVC como todos sabes pues
entonces me gustaria preguntarles.

Yo tengo en mi aplicacion clases, como Articulo, Producto . Cuando
genero automaticamente con Doctrine en mi caso, me crea estas clases
en la carpeta lib. Esta clase Articulo por ejemplo extiende de
BaseArticulo.

Articulo extends BaseArticulo{

}
La cosa es que mis metodos de Articulo deben estar aca?? por ejemplo

Articulo extends BaseArticulo{

public function agregarArticulo(){
.......
}

public function borrarArticulo(){

..........
}

}

En mi aplicacion anterior he puesto toda la logica como agregar o
borrare en sus respectivas acciones ej.: sitio.com/articulo/
agregar sitio.com/articulo/borrar . Lo que hacia que la accion sea
muy larga y segun el libro de symfony debe contener , para darse una
idea, no mas de 10 linas de codigo.

La pregunta siguiente es, si yo debo al agregar el Articulo guardar
una foto, la logica de agregar la foto, debe estar en el metodo
agregarArticulo() o en una clase aparte que se llame foto y haya un
metodo que se llame guardarFoto() ?? y logicamente llamar a a
guardarFoto() desde agregarArticulo.

entonces desde el action solamente tendria que hacer:

$articulo = new Articulo();
$articulo->agregarArticulo();


y quedando:

la clase articulos en los directorios /lib/doctrine
la clase foto en /lib

Y que sucede si para agregar el articulo, no tengo que primero usar
algo de logica para saber si el usuario tiene permisos o no de agregar
un articulo, donde deberia estar el codigo ese ?

A ver si me pueden orientar , y saber sus experiencias de como dividen
su aplicacion.

Gracias!!

Nico



alejandro ison

unread,
Jun 22, 2009, 5:35:44 PM6/22/09
to symfony-es
hola, mira yo tuve un problema parecido, con lo que aprendi donde
trabajaba una buena forma es asi.

/lib/doctrine/model/ (.class) los uso de proxy con los
".tables.class")

/lib/doctrine/model/ (los Tables.class) aqui puse los
doctrine_records,las sentencias y las los "saves" que se hagan se hace
todo aqui.

cree una carpteta /lib/class/* aqui va una capa "inventada" de
servicio. esto es asi para que varias aplicaciones usen lo mismo.
fijate que van las exception de algunos errores que pueden caer el
sistema o si queres que un usuario haga solo algo definido (reglas de
negocio).
tambien fijate que son staticas todas .


En los actions van solo como los ves. siempre con exceptions o
cacheadas por cualquier drama.

mira en a mi proyecto asi ves lo que estoy haciendo, en este
proyecto hay dos aplicaciones y podras ver que trabajan con la capa de
servicio

http://code.google.com/p/comunidad-libre/source/browse/

quedaria algo asi:

vista
controlador
servicio
modelo



quizas sea medio dificil instalar el proyecto en tu maquina, las
configuraciones y los links de sistema quizas que no te dejen usarlo.
mandame un mail cualquier cosa.(no va a estar mucho tiempo online.
antes de terminarlo lo saco para venderlo. jeje).

mi mails es el mismo del usuario de google

saludos . espero que te sirva .

Nixs

unread,
Jun 22, 2009, 8:26:04 PM6/22/09
to symfony-es
ahhh ya voy entendiendo, osea que en realidad , hiciste una especie de
programacion en 4 capas. Me parece muy interezante, tmb la idea de
hacer todos los metodos estaticos.

Entonces ,mi forma de agregar un Articulo seria lo siguiente, viendo
al clase

Articulo extends BaseArticulo{ <-- articulo que esta en /lib/model/
doctrine , que estiende de
/lib/model/
doctrine/base/BaseArticulo.class.php
}


public function agregarArticulo(){

$idFoto=Foto::guardarFoto() <-- la clase Foto la
tengo en /lib/class
(setear todos los atributos ....) ->save();

}

}

Y todo esto lo llamo del Actions

public function executeAgregarArticulo(){

try{

$articulo = new Articulo();
$articulo->agregarArticulo();

}
catch (ArticuloExeption $e){
.....
}

Creo que ahi iria bien. Muchas gracias Alejandro, estoy analizando tu
codigo para de paso ver otras cosas de como estructuras las cosas.
Saludos y gracias!!

Blacknet

unread,
Jun 23, 2009, 7:35:38 AM6/23/09
to symfony-es
Buenas chicos os explico un poco.

Symfony esta basado en una metodología de desarrollo en tres capas:
Modelo: En esta capa se definen única y exclusivamente los objetos
que contienen los datos que usaremos en nuestra aplicación y se
encarga de leer y escribir los datos en la base de datos. Se podría
decir que es la capa más baja de la aplicación y aquí nunca irá ningún
tipo de código que muestre nada o que indique cómo funciona la
aplicación.

Controlador: Esta capa funciona de forma que conecta el modelo con
la vista y, a su vez, controla todo el funcionamiento de la web,
creando objetos, enlaces y asociaciones entre objetos. Se podría decir
que esta es la capa intermedia y aquí nunca ira ningun tipo de codigo
que muestre nada al exterior o que definan objetos del modelo de
datos.

Vista: En esta capa única y exclusivamente se muestra el código que
será el resultado de las operaciones ejecutadas en las dos capas
anteriores y todo su contenido esta badado en los datos obtenidos de
las capas inferiores.

Es muy importante concoer detalles básicos de ingenieria del software
y de modelos de desarrollo orientados a objetos. Symfony, aunque muy
fácil de usar, no es una herramienta que cualquier aficcionado a la
programación web pueda usar ya que, además de los conocimientos
previos de php que requiere también incluye una formación adiccional
sobre ingenieria del software.

Teniendo claro todo esto, una persona que use symfony con
conocimientos de ingenieria del software, en concreto la fase de
diseño, no tendrá ningún problema en saber perfectamente donde debe ir
cada parte del código y ser capaz de integrar cualquier subsistema en
symfony.

Si necesitais documentación sobre ingenieria del software o la
programación orientada a objetos solo teneis que escribirme un correo
y os envio varias cosillas.

Un saludo y espero haberos ayudado un poco.

Blacknet

unread,
Jun 23, 2009, 8:02:28 AM6/23/09
to symfony-es
Esto que haces parece estar muy bien, sin embargo estas creando algo
que los desarrolladores de symfony han intentado evitar por todos los
medios.
Acoplamiento funcional, ahora todas las clases del modelo dependen de
la capa de servicio que has generado por lo que la portabilidad y
flexibilidad de tus aplicaciones se ve reducida enormemente. Hay que
intentar que cada clase, componente y módulo sea lo mas independiente
posible, tanto que uno deba ser capaz de copiar y pegar los archivos
de un modulo a otra aplicación (que tenga el mismo modelo si lo usa) y
esta siga funcionando perfectamente. De esta forma nos ahorraremos aún
más horas de trabajo, aunque al principio no lo parezca.

Un saludo

Nixs

unread,
Jun 23, 2009, 2:12:38 PM6/23/09
to symfony-es
Tienes toda la razon . Y que solucion se te ocurre a ti Blacknet?

alejandro ison

unread,
Jun 23, 2009, 8:00:59 PM6/23/09
to symfony-es
Hola Backnet , UH entonces no esta bien lo que hice, lastima que anda
bien che. pero bueno.

Blacknet

unread,
Jun 24, 2009, 3:28:34 AM6/24/09
to symfony-es
Nixs no sé si tu caso es un ejemplo generalizado o es concrétamente lo
que quieres hacer, pero symfony en su framework de formularios ya
incluye la función de introducir ficheros automáticamente añadiendole
una función de hash, no obstante si lo que necesitas es trabajar con
imágenes de forma distinta es posible que tengas que crear una nueva
clase imágenes con las funciones para estas clases y crear una
asociación entre la clase artículo y la clase imágenes.

Ya esto lo puedes hacer como quieras, mediante un nuevo módulo symfony
(que no contenga vista) o creando la clase manualmente. Sin embargo
tienes que recordar siempre que has de respetar las tres capas, en el
modelo iran el acceso al nombre de la imágen y, si es necesario, la
ruta. y en el controlador las funciones para borrar, guardar y editar
fotos.

En la clase articulo ahora habrá una tabla que relacione el id del
artículo con las imágenes (esto si cada artículo tiene más de una
imagen) o en la tabla articulo habra una referencia al a clave de la
imagen (si es una y magen sólo).

Espero haberte ayudado. No pongo código porque creo que es mejor
captar la idea de lo que debes hacer que poner aquí el código y que no
te enteres de nada.

Por cierto para el tema de subir imágenes mediante el framework de
formularios de symfony puedes mirar en www.librosweb.es y en el manual
de joobet.

Un saludo.

Nixs

unread,
Jun 24, 2009, 12:03:40 PM6/24/09
to symfony-es
El caso de la foto es un ejemplo, no el problema en si. Por ejemplo,
que pasa si necesito hacer una estadistica muy compleja que lleva
varias lines de codigo, Para ello creo una clase que lo resuelva. Pero
donde meto esa clase??? en la Vista logico que no, en el Controlador
no - es muy largo y no corresponde, en el Modelo? creo que tampoco,
porque no corresponde al modelo de datos, no podria ponerlo dentro de
ninguna clase del Modelo de datos o si lo pusiera seria incorrecto. Y
entonces, donde va mi pobre clase a parar?? creo que lo de crear una
carpeta /lib/class es la mejor opcion.
Otra cosa, la portabilidad es relativa, ya que si yo hago mi projecto
usando la libreria prototype, este solo funcionara con esa libreria,
si yo utilizo el plugin sfGuard agrego clases y reduzco portabilidad.
Y los plugins?? que son?? son M V o C ?? Si yo instalo el plugin
sfPhpMailer, voy a usar esta clase en mi aplicacion, por lo que la
aplicacion necesitará si o si de este plugin, que en realidad son un
conjuntos de clases, para funcionar.

Alguien se le ocurre alguna solución? estoy seguro que cada uno lo
resuelve de alguna forma este tema. Talvez estemos necesitando una 4
capa de negocio a mi forma de ver. que piensan ??

On 24 jun, 04:28, Blacknet <jesus.mur...@livesoft.es> wrote:
> Nixs no sé si tu caso es un ejemplo generalizado o es concrétamente lo
> que quieres hacer, pero symfony en su framework de formularios ya
> incluye la función de introducir ficheros automáticamente añadiendole
> una función de hash, no obstante si lo que necesitas es trabajar con
> imágenes de forma distinta es posible que tengas que crear una nueva
> clase imágenes con las funciones para estas clases y crear una
> asociación entre la clase artículo y la clase imágenes.
>
> Ya esto lo puedes hacer como quieras, mediante un nuevo módulo symfony
> (que no contenga vista) o creando la clase manualmente. Sin embargo
> tienes que recordar siempre que has de respetar las tres capas, en el
> modelo iran el acceso al nombre de la imágen y, si es necesario, la
> ruta. y en el controlador las funciones para borrar, guardar y editar
> fotos.
>
> En la clase articulo ahora habrá una tabla que relacione el id del
> artículo con las imágenes (esto si cada artículo tiene más de una
> imagen) o en la tabla articulo habra una referencia al a clave de la
> imagen (si es una y magen sólo).
>
> Espero haberte ayudado. No pongo código porque creo que es mejor
> captar la idea de lo que debes hacer que poner aquí el código y que no
> te enteres de nada.
>
> Por cierto para el tema de subir imágenes mediante el framework de
> formularios de symfony puedes mirar enwww.librosweb.esy en el manual

alejandro ison

unread,
Jun 24, 2009, 6:24:38 PM6/24/09
to symfony-es
Claro Nixs , es asi, el tema es que el MVC es muy lindo pero aca el
tema es conceptual,

por ejemplo :


Controlador: no se deverian crear objetos del dominio, no deberian
existir los "New articulos()" ni realizaar saves() por mas que sea un
$form, eso es cosa del

modelo no del controlador.

solo se encarga de la parte "request", sesiones y pasar datos a la
capa que falta (en mi caso servicio).

modelo , no puede recibir datos directamente de un "form", no se
pueden realizar redirecciones ni tratar sesiones desde ahi.

con este forma de ver las cosas vemos la falta de la 4 capa.

Te comento Nixs que donde trabajaba usaban symfony con 9 capas
mas !!! (readers,adapters,actions(actions compartidas por algunas

aplicaciones),parsers,rules,task,util,view,service ),) era la unica
forma de poder usar symfony con 7 aplicaciones

(yahoo, web, admin ,iphone ,sms ,wap ,web, feedreaders) la diseñaron
unos ingenieros . asi que no hay drama si le agregas una mas.

y creeme que no perdieron ninguna portabilidad, ni nada que se
parezca, podias colgar cualquier app al sistema y salia funcionando lo
mas bien.

alejandro ison

unread,
Jun 24, 2009, 6:27:41 PM6/24/09
to symfony-es

perdon los los errores ortograficos

Nixs

unread,
Jun 24, 2009, 6:49:49 PM6/24/09
to symfony-es
Mira vos que interezante xd!!! que manejo!

Te agradezco mucho alejandro por tu explicacion. Tmb dejarme ver como
habias hecho esta aplicacion tuya, ya que entendi algunas cosas de
como manejas la seguridad, los actions tan limpios (si veras mi
anterior proyecto que los actions eran de 40 lineas :( ) .

On 24 jun, 19:27, alejandro ison <alejandrogui...@gmail.com> wrote:
> perdon los los errores ortograficos

alejandro ison

unread,
Jun 24, 2009, 7:05:23 PM6/24/09
to symfony-es

si , ese es el tema , al poner una capa mas se limpian las cosas. yo
tambien hacia actions de 40 lineas. hasta que aprendi a hacer las
cosas de la manera mas facil y buena. Nadie nace sabiendo, saludos !!!

Blacknet

unread,
Jun 25, 2009, 5:30:25 AM6/25/09
to symfony-es
Te doi la razón en ese tema Alejandro. Pero como bien tú has dicho el
agregar una nueva capa implica ingeniería y ser consciente de que esa
capa es necesaria para toda la aplicación. Y también habría que tener
en cuenta si, en tiempo merece la pena crear una capa más o complicar
un poco el código.

Yo ahora me encuentro en la aplicación que estoy haciendo un problema
similar ya que genero un código json a traves de un objeto que aun no
he definido y estoy pensando si generar el código a lo "bruto" o crear
una nueva clase para poder crear objetos de este tipo.

Mi duda nace en que este objeto json lo voy a necesitar cada vez que
muestre un listado sea del módulo que sea, pero por otro lado generar
el código manualmente me va a dar el mismo resultado y me va a ahorrar
crear una nueva clase.

¿qué opinais?

Nixs

unread,
Jun 25, 2009, 10:56:11 AM6/25/09
to symfony-es
Yo creo que te conviene general la clase, ya que si en un momento
necesitas cambiar la forma de listar, vas a tener que hacerlo en toda
la aplicacion, y en cambio con tu clase en un solo punto tendrás
todos. es mi forma de ver

saludos

Blacknet

unread,
Jun 26, 2009, 3:16:09 AM6/26/09
to symfony-es
La forma de listar no cambia ya que depende del componente que uso
Jqgrid y el objeto solo lo uso para luego transformarlo en codigo
json. De ahi mi duda.
Reply all
Reply to author
Forward
0 new messages