Una controlador provee comunicación entre la aplicación, los modelos y las vistas. El controlador trae las entradas desde la petición HTTP y usa los modelos y la correspondiente vista para producir la respuesta HTTP necesaria.
Los controladores que pertenecen a un módulo residen típicamente en la subcarpeta
Controller
del directorio fuente del módulo (se muestra en la figura 4.3).
Zend Skeleton Application nos provee de una implementación por defecto de la clase
IndexController
. La clase IndexController
es típicamente la clase controladora
principal de un sitio web. El código se presenta abajo (algunas partes se omitieron
por simplicidad):
<?php
namespace Application\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
class IndexController extends AbstractActionController
{
public function indexAction()
{
return new ViewModel();
}
}
En el ejemplo de arriba podemos ver que los controladores usualmente definen su
propio namespace (línea 2). El controlador Index, como todos los otros controladores
del módulo Application, están en el namespace Application\Controller
.
Un controlador es una clase PHP normal que se deriva de la clase base AbstractAcionController
(línea 7).
Por defecto la clase controlador contiene un solo método de acción llamado
indexAction()
(ver líneas 9-12). Generalmente, crearemos otros métodos de acción
en las clases controladoras.
ZF3 reconoce automáticamente el método de acción por el sufijo
Action
. Si el nombre del método en el controlador no tiene el sufijo, este se considera como un método usual y no una acción.
Como lo dice su nombre, un método de acción ejecuta una acción del sitio web que generalmente resulta en la producción de una página web. El controlador Index usualmente contiene los métodos de acción para las páginas principales del sitio web. Por ejemplo, tendremos la acción "index" para la página Home, la acción "about" para la página Acerca de, la acción "contactUs" para la página Contactanos y posiblemente otras acciones.
Método de Acción | Descripción |
---|---|
IndexController::indexAction() |
La acción "index" muestra la página Home de nuestro sitio web. |
IndexController::aboutAction() |
La acción "about" muestra la página Acerca de del sitio web. La página Acerca de contiene información de contacto y de derechos de autor. |
IndexController::contactUsAction() |
La acción "contactUs" action muestra la página Contactanos del sitio web. Esta página muestra el formulario para contactar a los autores del sitio. |
Cada controlador de nuestra página web hereda desde la clase base AbstractActionController
.
En la figura 4.4 el diagrama de herencia de clase se presenta.
La clase AbstractActionController
nos provee de varios métodos útiles que se pueden
usar en las clases controladoras. La tabla 4.2 muestra un breve resumen de los métodos:
Nombre del Método | Descripción |
---|---|
getRequest() |
Recupera el objeto Zend\Http\Request , que es la representación de los datos de la petición HTTP. |
getResponse() |
Recupera el objeto Zend\Http\PhpEnvironment\Response que permite insertar datos en la respuesta HTTP. |
getEventManager() |
Regresa el objeto Zend\EventManager\EventManager que permite lanzar eventos y escuchar los eventos. |
getEvent() |
Regresa el objeto Zend\Mvc\MvcEvent que representa al evento al que el controlador responde. |
getPluginManager() |
Regresa el objeto Zend\Mvc\Controller\PluginManager que se puede usar para registrar complementos controladores (controller plugins) |
plugin($name, $options) |
Este método permite acceder a determinado complemento a partir de un nombre dado. |
__call($method, $params) |
Permite llamar a un complemento indirectamente usando el método mágico de PHP __call . |
Como podemos ver en la tabla de arriba la clase controladora base nos permite acceder a los datos de la petición y respuesta HTTP, además, provee de acceso al administrador de eventos (event manager). Además, nos da la capacidad de registrar y llamar a los complementos del controlador (aprenderemos sobre los complementos del controlador luego en este capítulo).