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.11. Complementos para el Controlador

Un complemento para controladores (controller plugin) es una clase que extiende la funcionalidad de todos los controladores.

Sin complementos para extender la funcionalidad a todos los controladores tendríamos que crear una clase base a la medida, por decir BaseController, y derivar todos los controladores de esta clase base. Esta manera puede ser usada, pero en opinión de los creadores de ZF3 los complements son una mejor solución porque ellos usan composición de clases 2 que provee mayor flexibilidad en comparación con la herencia de clases. Registramos el controlador de tipo complemento y este automáticamente es accesible desde todos los controladores de nuestra aplicación (la clase base AbstractActionController usa el método mágico __call() como intermediario para llamar a los complementos para los controladores registrados).

2) La Composición es una relación entre dos clases que se describe mejor como una relación "tiene-una" (has-a) o "todo/parte" (whole/part). La clase dueña contienen una referencia a otra clase (complemento). El dueño es responsable de la vida del objeto que él usa.

Hay varios complementos estándares para clases disponibles luego de la instalación (tabla 4.6) y ya hemos usado uno de ellos (el complemento Param) en uno de los ejemplos anteriores.

Tabla 4.6. Complementos Estándares para Controladores
Clase Complementaria Estándar Descripción
Params Permite recuperar variables desde la petición HTTP incluyendo las variables GET y POST.
Url Permite generar URLs absolutas o relativas dentro de los controladores.
Layout Da acceso al modelo de la vista para pasar datos a la plantilla de diseño.
Identity Regresa la identidad del usuario quien ha iniciado sesión en el sitio web.
FlashMessenger Permite definir mensajes "flash" que son almacenados en la sesión y se puede mostrar en una página web diferente.
Redirect Permite redireccionar la petición a otro método de acción del controlador.
PostRedirectGet Redireciona la petición POST convirtiendo todas las variables POST en variables GET.
FilePostRedirectGet Redirecciona la petición POST conservando los archivos cargados.

Dentro de un método de acción en un controlador podemos acceder a un complemento de la siguiente manera:

// Access Url plugin
$urlPluguin = $this->url();

// Access Layout plugin
$layoutPlugin = $this->layout();

// Access Redirect plugin
$redirectPlugin = $this->redirect();

Como alternativa podemos invocar un complemento por medio de su nombre completo con el método plugin() que provee la clase controladora base, de la siguiente manera:

use Zend\Mvc\Controller\Plugin\Url;

// Inside your controller's action use the plugin() method.
$urlPlugin = $this->plugin(Url::class);

4.11.1. Escribir Nuestro Propio Complemento para Controladores

En nuestro sitio web probablemente necesitaremos crear un complemento a la medida para controladores. Por ejemplo, asumiendo que necesitamos que todos las clases controladoras sean capaces de revisar si a un usuario se le permite acceder a una determinada acción del controlador. Esto se puede implementar con la clase AccessPlugin.

El complemento para controladores se debería derivar de la clase AbstractPlugin. Los complementos típicamente se encuentran en su propio namespace: Plugin, que está anidado en el namespace Controller:

<?php
namespace Application\Controller\Plugin;

use Zend\Mvc\Controller\Plugin\AbstractPlugin;

// Plugin class
class AccessPlugin extends AbstractPlugin
{
    // This method checks whether user is allowed
    // to visit the page
    public function checkAccess($actionName)
    {
        // ...
    }
}

Para informar a Zend Framework 3 sobre el nuevo complemento necesitamos registrarlo en el archivo module.config.php con la llave controller_plugins. Veamos el ejemplo más abajo:

<?php
return [
    // ...

    'controller_plugins' => [
        'factories' => [
            Controller\Plugin\AccessPlugin::class => InvokableFactory::class,
        ],
        'aliases' => [
            'access' => Controller\Plugin\AccessPlugin::class,
        ]
    ],

    // ...
];

Notemos que además registramos un alias para el complemento con lo que somos capaces de traer el complemento por medio de su nombre corto.

Después de esto seremos capaces de acceder a nuestro complemento desarrollado a la medida desde todas las acciones del controlador de la siguiente manera:

// Check if site user is allowed to visit the "index" page
$isAllowed = $this->access()->checkAccess('index');

Top