Plugins

Los plugins son pequeñas porciones de codigo totalmente independientes que realizan alguna tarea necesaria o util para el sistema y que no esta relacionado con ningun modulo, ni adaptador.

IMPORTANTE

Para los plugins que se ejecutan antes del adaptador, incluso antes de que el sistema conozca cual adaptador vamos a ejecutar, por lo cual tampoco tenemos modelos cargados.
Si necesitamos algun recurso deberemos asegurarnos de tenerlo para el correcto funcionamiento de nuestro script.
Una forma de tener los recursos disponibles y mantenerlos durante el transcurso de la peticion es realizarlo en el bootstrap de la Aplicacion o el bootstrap del modulo.

Por ejemplo si en nuestro plugins necesitamos la vista para pasarle un valor, en el boostrap de la aplicacion realizamos:
<?php
// Ejemplo [1], levantar recurso en el Bootstrap
class BootstrapApplication extends \agenor\mva\BootstrapAbstract
{    
    public function 
_startVista()
    {
        
$view   = new \agenor\mva\View();
        return 
$view;
    }
}
Lo que hace el sistema es ejecutar automaticamente todo metodo del Bootstrap que empieza por _start, y en caso de retornar algun valor u objeto, lo guarda en el Registry del sistema con el nombre que le sigue a _start en este caso Vista, el cual podra ser accedido desde todo el sistema.

Caracteristicas

Todos los plugins deberan implementar la interface Plugin, que se encuentra en \agenor\mva\Plugins, para asegurarse el sistema de que exista el metodo execute.
public static function execute();
El precedente es el unico metodo que exige el sistema para ser un plugin valido, en caso de igual tener el metodo execute pero no implementar la interface, el sistema lanzara un error por no considerarlo valido.

Otra de las condiciones para ser ejecutado con exito es que debe estar incluido en el directorio plugins del raiz del proyecto y este directorio por el momento no es configurable.

Lanzando el Plugins

Los plugins a diferencia de otras caracteristicas del sistema no se cargan de forma dinamica, si no que es a demanda y pueden ser ejecutados antes de la carga del adaptador o luego de finalizado el mismo.
Se cargan solo desde el BoostrapApplication o desde el Bootstrap del modulo que se va a ejecutar. La carga del mismo se debe realizar en un metodo _start del bootstrap dado que estos metodos se ejecutan siempre.
En ellos debemos poner:
$this->getRouter()->setPlugins('Menu', 'PRE', 0);
El codigo anterior lo que hace es primero obtener la instancia del Router del sistema $this->getRouter(), dicho recurso tiene el metodo que permite configurar los plugins del sistema que es setPlugins('Menu', 'PRE', 0);, los parametros que son pasados son
1> El nombre del plugins que se va a ejecutar, que debe coincidir con una clase del directorio plugins.
2> Posicion de la ejecucion del plugins si es PRE adaptador o POST adaptador la ejecucion del mismo. Por PRE se ejecuta antes incluso del metodo init del adaptador, y por POST se ejecuta incluso luego del metodo post del adaptador.
3> Es la posicion de orden de ejecucion de los plugins.

Ejemplo Completo

Vamos a desarrollar un ejemplo de utilizacion de un plugins, con todos los ejemplos dados anteriormente.
1°> Creamos una Clase Menu que implementara \agenor\mva\Plugins y estara ubicada en el directorio plugins del Raiz.
  •  pulgis
    • Menu.php
El archivo Menu.php
<?php
// archivo Menu.php
namespace plugins;

class 
Menu implements \agenor\mva\Plugin
{
    
/**
     * Levanta el Perfil del Menu que se desea Cargar y se lo pasa a la Vista.
     */
    
public static function execute()
    {
        
$idPerfil   = \agenor\security\Session::get('PERFIL_ACCESO');
        
$idPerfil   = ($idPerfil)? $idPerfil 0;
        
$view       = \agenor\mva\Registry::getObjectsType('agenor\mva\View'true);

        
$view->menuPerfilNro $idPerfil;
    }
}
Que hace este pequeño plugins,
1ero> class Menu implements \agenor\mva\Plugin , como vemos implementa la interfaz Plugins y la clase se llama Menu igual que el archivo (Menu.php).
2ndo> public static function execute() , aqui esta la unica implementacion exigida por la interfaz donde va el codigo que queremos que se ejecute.
En este plugins $idPerfil = \agenor\security\Session::get('PERFIL_ACCESO'); levanta el numero del perfil del usuario registrado, $idPerfil = ($idPerfil)? $idPerfil : 0; si no existe le asigna el numero 0 (cero), luego $view = \agenor\mva\Registry::getObjectsType('agenor\mva\View', true); carga el recurso View (Vista), para su posterior uso este tuvo que ser cargado anteriormente y por ultimo $view->menuPerfilNro = $idPerfil; a la vista le asignamos la variable menuPerfilNro con el numero de session.

Para que todo esto funcione hacen falta dos cosas, una que el recurso View este disponible en el sistema y que se carguen los plugins en el sistema. Como la vista recien se genera cuando se instancia al Adaptador y estara disponible despues de lanzado el plugins debemos asegurarnos de cargar una, para hacer estas tareas utilizaremos el BoostrapApplication.
<?php
class BootstrapApplication extends \agenor\mva\BootstrapAbstract
{
    
/**
     * Sirve para Configurar la Vista que sera usada en el sitio.
     * Si se configura aqui el controllador la toma como propia si no 
     * crea una nueva.
     * @return  View
     */
    
public function _startVista()
    {
        
$view           = new \agenor\mva\View();
        return 
$view;
    }
    
    
/**
     * Levantamos el Plugin que permite cargar Menu.
     */
    
public function _startPlugins()
    {
        
$this->getRouter()->setPlugins('Menu''PRE'0);
    }
}
En esta parte final, tenemos 2 metodos, _startVista() es el encargado de generar una vista y como retorna el objeto este es guardado en el registry con el nombre de Vista, es necesario la carga de una vista pues sera utilizada por nuestro plugin y _startPlugins que realiza la carga de nuestro plugins en el sistema.

RECORDAR

Todo recurso que requiera ser utilizado por nuestro plugins, debera o ser cargado en el mismo o anteriormente a la ejecucion del mismo.
Esto requiere mayor relevancia con los plugins que se ejecutan antes de nuestro adaptador.

Llegado a este punto es importante tener claro la diferencia entre Widget y Plugins, los primeros se ejecutan una vez levantado el adaptador que se desea ejecutar y ademas ellos ejecutan un adaptador y muestran una vista, es casi igual que una peticion normal pero un poco mas limitada. Mientras que los segundos no ejecutan en principio ningun adaptador y es un codigo aislado de la aplicacion principal y ellos mismos deben ser autosufucientes.