A free and open-source book on ZF3 for beginners

Translation into this language is not yet finished. You can help this project by translating the chapters and contributing your changes.

4.23. Controladores Flacos, Modelos Gordos y Vistas Simples

Cuando desarrollamos un sitio web usando el patrón Modelo-Vista-Controlador está el riesgo de mal interpretar el rol de los controladores, las vistas y los modelos. El resultado de esto es controladores enormes y modelos pequeños lo que hace difícil probar y mantener nuestra aplicación. El objetivo de esta sección es dar una comprensión general sobre el código que se puede colocar en la clase controladora, el que se puede colocar en la plantilla de vista y el código que se puede colocar en una clase modelo.

4.23.1. Controladores Flacos

La idea que está detrás del termino "controladores flacos" (skinny controller) es que generalmente en nuestras clases controladoras solo colocamos código que:

A controller class should avoid:

Para un ejemplo de un controlador "flaco" miremos más abajo la clase CurrencyConverterController. Este controlador provee el método de acción "convert" cuyo objetivo es convertir un cantidad de EUR a USD. El usuario pasa la cantidad de dinero a través de la variable GET "amount".

class CurrencyConverterController extends AbstractActionController
{
    // Currency converter model
    private $currencyConverter;

    // Constructor. It's purpose is to "inject" dependencies.
    public function __construct($currencyConverter)
    {
        $this->currencyConverter = $currencyConverter;
    }

    // The "convert" action displays the converted money amount
    public function convertAction()
    {
        // Get the money amount from GET
        $amount = (float)$this->params()->fromQuery('amount', -1);

        // Validate input data
        if($amount<0) {
            // Money amount is missing
            $this->getResponse()->setStatusCode(404);
            return;
        }

        // Pass the data to the CurrencyConverter model
        $convertedAmount = $this->currencyConverter->convertEURtoUSD($amount);

        return new ViewModel([
            'amount'=>$amount,
            'convertedAmount'=>$convertedAmount
        ]);
    }
}

El método de acción del controlador anterior hace lo siguiente:

4.23.2. Modelos Gordos

Como necesitamos mantener nuestros controladores tan flacos como sea posible la mayoría de la lógica de negocio de nuestra aplicación se debería colocar dentro de las clases modelo. En una aplicación diseñada correctamente bajo el patrón Modelo-Vista-Controlador los modelos se ven "enormes". Una clase de modelo puede contener código que:

En las clases de modelo no es recomendable:

Si seguimos estos principios encontraremos que nuestros modelos son fáciles de probar porque ellos tienen identificados claramente las entradas y las salidas. Podemos escribir pruebas unitarias que pasan determinados datos de prueba como entrada a los modelos, recuperar los datos de salida y verificar que los datos son correctos.

Si estamos confundidos sobre donde colocar un determinado segmento de código o en el controlador o en el modelo, podemos intentar preguntarnos a nosotros mismos: ¿Es este pedazo de código una regla del negocio importante que necesita ser cuidadosamente probada? si la respuesta es sí debemos colocar el código en un modelo.

4.23.3. Plantillas de Vista Simple

Como la mayoría de la lógica se guarda en los modelos, nuestras plantillas de vista serán tan simples como sea posible para producir la presentación de los datos que se pasan a través del contenedor de variables. En una plantilla de vista podemos:

No es recomendable que las plantillas de vista:

Si seguimos estos principios encontraremos que nuestras vistas se pueden sustituir fácilmente sin modificar la lógica de negocio de nuestra aplicación. Por ejemplo, podemos fácilmente cambiar el diseño de nuestra página web o introducir temas intercambiables.


Top