Buenas prácticas en un MVC

En un framework de desarrollo basado en el patrón Modelo-Vista-Controlador como es el caso de CakePHP, es muy recomendable conocer cada una de las capas y tratar de ubicar el código necesario en la capa más adecuada.

Conforme más he ido usando este patrón más me he dado cuenta (por lo menos en los desarrollos que me he visto involucrado) que lo más eficiente es lo que denomino “subir el código” (permitirme poner nombre a algo que ya existe, pero me hacía ilusión). El hecho de poner el máximo código posible o mejor dicho, el mayor número de lógica en los Modelos.

Con el siguiente ejemplo espero explicarme mejor:

Pongamos que tenemos que mostrar los registros de una base de datos, por ejemplo, personas. Pero no todas las personas, únicamente las de sexo femenino.

1.- Manera realmente fea

Obtenemos desde el controlador mediante un find(’all’) todos los registros de la tabla y en nuestra vista, dentro del bucle de obtención de datos foreach. Añadimos un if que sólo muestre los registros deseados.

controlador

$this->set('personas', $this->Personas->find('all');

vista

foreach($persona as $persona):
if( $persona['Personas']['sexo'] == 'M' ) {
pr($persona);
}
endforeach;

2.- Manera menos fea

Desde el controlador filtramos en la consulta al modelo los registros que deseamos. Liberando a la vista de la lógica pudiéndose dedicar únicamente a mostrar la información.

controlador

$this->set('personas', $this->Personas->find('all', array('conditions'=>array('sexo'=>'M')));

vista

foreach($persona as $persona):
pr($persona);
endforeach;

3.- Mejor manera

Trasladamos toda la lógica al modelo. El controlador únicamente llama a un método del modelo y la vista únicamente muestra información.

modelo

function getMujeres(){
return $this->find('all', array('conditions'=>array('sexo'=>'M')));
}

controlador

$this->set('personas', $this->Personas->getMujeres());

vista

foreach($persona as $persona):
pr($persona);
endforeach;

De esta última manera, liberamos la vista, haciéndola menor, fácil de mantener y reutilizable. Sobre todo si quien la manipula es un maquetador con no muchos conocimientos de programación.
El controlador únicamente se dedica a realizar la acción pedida, ejecutando si es preciso métodos del modelo para poder proporcionar la información a la vista. Cambiar la fuente de información es tan sencillo como llamar a uno u otro método del modelo.
El modelo ahora tiene toda la lógica de obtención de información. Proporcionando métodos de acceso a la información que pueden ser utilizados por el controlador.

Espero haberme explicado y como no, abierto a aportaciones y comentarios.

Tags: