Carlos Robles frikiblog

return fully qualified ViewModels – Mejorar el rendimiento, o forzar una vista concreta.

| 0 comments

En Zend Framework 2, por lo general para cargar una vista, en nuestro controlador hacemos una de estas dos cosas

public function unaAction()
{
return array( /*valores a pasar a la vista*/ );
}
//o un poco mas explícito

public function otraAction()
{
return new ViewModel(array(/*valores a pasar a la vista*/));
}

¿Qué implica esto?

ZF2 utiliza la llamada “PhpRenderer-Strategy”, que va a hacer una serie de comprobaciones, sobre el valor devuelvto por un controlador-accion.

  1. Si es solo un array, el framework crea un ViewModel.
  2. Después se busca el template asignado. Si no hay ninguno explícito, el framework busca el que corresponda, comprobando el módulo actual, el controlador actual, y la acción actual. Basado en eso se localiza un archivo con la vista correspondiente.
  3. Después de esto, el renderizado puede empezar.

Esto está bien, pero tiene dos limitaciones:

  1. El rendimiento no es el mejor. El framework esta haciendo muchas comprobaciones para algo que no cambia en runtime y nosotros sabíamos por adelantado.
  2. El template cargado depende del modulo/controlador/acción solicitado, pero puede que para el mismo el modulo/controlador/acción nos interese una diferente colección de plantillas,  por ejemplo si el usuario solicita un listado segun unos criterios, puede que tengamos un template para el listado, y queramos tener otro archivo para cuando no hay resultados, y queremos hacerlo sin introducir lógica en la vista y mezclar cosas distintas, y no tener que hacer redirecciones o trucos de magia.

¿Alternativa?

Fácil, tanto para la segunda situacion, como en general si queremos mejorar el rendimiento, podemos decirle al ViewModel que template nos interesa que carge.

public function unaAction() {
$viewModel = new  ViewModel();

$viewModel->setTemplate('MODULO/CONTROLADOR/ACCION');

/*Yo  uilizo el modulo y controlador real, pero el nombre de la acción puede o no corresponder a una acción que exista de verdad, con tal de que el template correspondiente si que exista.  Por ejemplo:

if (count($elementos))
$viewModel->setTemplate('elementos/buscar/index');

else
$viewModel->setTemplate('elementos/buscar/sinresultados');
 

*/

return $viewModel->setVariables(array(/*valores a pasar a la vista*/));

}

Y eso es todo.

Si lo queremos hacer por temas de rendimiento, por su puesto que es mucho mas tedioso que la forma habitual, pero está bien considerarlo en aplicaciones con mucho uso a las que realmente necesitemos sacar el máximo.

Facebook Twitter Linkedin Plusone Digg Delicious Reddit Email

Leave a Reply

Required fields are marked *.