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 baseAbstractActionController
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.
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);
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');