Advertisement
  1. Code
  2. CodeIgniter

Cómo funciona el sistema de Hooks en CodeIgniter

Scroll to top
Read Time: 9 min

Spanish (Español) translation by steven (you can also view the original English article)

Como desarrollador de CodeIgniter, a veces terminas en una situación que requiere que modifiques el núcleo del framework o el flujo de ejecución para cumplir con tus requisitos personalizados. Por supuesto, nunca se recomienda modificar los archivos principales, ya que hace que el proceso de actualización sea engorroso. Afortunadamente, el framework CodeIgniter viene con el sistema de ganchos (hooks), que te permite lidiar con este escenario.

En este artículo, comenzaremos con una introducción al sistema de ganchos en el framework CodeIgniter. Luego, hablaremos sobre los diferentes tipos de ganchos disponibles. Y finalmente, aprovecharemos esta oportunidad para explorar la creación de ganchos personalizados.

Hooks: Un sistema para sobrescribir el Framework principal

Echemos un vistazo rápido a lo que dice la documentación oficial de CodeIgniter sobre el sistema de ganchos:

Los ganchos en CodeIgniter proporcionan un medio para aprovechar y modificar el funcionamiento interno del framework sin piratear los archivos principales.

Suena bastante claro, ¿no? En el desarrollo de tu aplicación diaria, si alguna vez te sientes tentado a modificar los archivos centrales de CodeIgniter, primero debes considerar el sistema de enlaces para ver si cumple con tus requisitos.

Supongamos que deseas crear un sistema de referencia de rendimiento personalizado para monitorear la ejecución de la aplicación. Te das cuenta de que los archivos principales deben modificarse para lograr el resultado deseado. En ese caso, puedes usar los ganchos pre_system y post_system para ingresar al flujo de ejecución y recopilar las estadísticas según sea necesario.

Si conoces el patrón de observador de eventos, el concepto es similar en el sentido de que escuchas los eventos generados por el sistema y el código de observador correspondiente se ejecuta cuando se activa el evento observado.

Así que esa fue una introducción básica al sistema de ganchos en CodeIgniter. En la siguiente sección, veremos de cerca los diferentes ganchos disponibles para que los conectes al sistema.

Pasar por los diferentes ganchos

El sistema de ganchos de CodeIgniter proporciona diferentes puntos de enganche que puedes utilizar al implementar tus ganchos personalizados. El punto de enlace es básicamente un estado determinado en el flujo de trabajo de ejecución de la solicitud en un momento dado.

Por ejemplo, cuando implementas el gancho pre_system, sabes que estás en el comienzo de la fase de arranque. Por otro lado, si has elegido el enlace post_system, puedes estar seguro de que la ejecución se completó y la respuesta ya se envió al cliente.

En esta sección, repasaremos los diferentes puntos de enlace que proporciona el sistema de ganchos CodeIgniter.

Ganchos del sistema

Los ganchos pre_system y post_system se incluyen en esta categoría, ya que el primero se llama muy temprano durante la fase de arranque, mientras que el último se llama después de que se completa la ejecución de la página.

Puedo pensar en algunos casos de uso que podrían lograrse con los ganchos del sistema:

  • Punto de referencia
  • Registro
  • Redirección basada en reglas
  • Y más

Controlador de los ganchos

Hay tres ganchos que se incluyen en esta categoría, así que repasemos cada uno de ellos.

Gancho "PreController"

El gancho pre_controller se llama justo antes de que se instancia la clase de controlador. Por lo tanto, si deseas realizar más comprobaciones antes de que se llame al controlador, este es el gancho que estás buscando.

Gancho "PostControllerConstructor"

Como sugiere el nombre, el gancho post_controller_constructor se llama inmediatamente después de que se crea una instancia del objeto controlador y antes de la llamada al método real.

En este punto, estás seguro de que se crea una instancia del controlador y que pronto se llamará al método, por lo que podrías cargar cualquier biblioteca específica del controlador aquí, o también podrías implementar la validación personalizada específica del controlador.

Hook "PostController"

El gancho post_controller se llama después de la ejecución del método del controlador. Por lo tanto, las cosas que deseas ejecutar después de la ejecución del controlador deben implementarse con este gancho.

Así que esa fue la historia de los ganchos específicos del controlador.

Sobrescribir los ganchos

Sobrescribir el gancho "Display"

Según la documentación de CodeIgniter, el gancho display_override anula el método principal _display. El método _display del core se usa para enviar la salida al cliente y, por lo tanto, al usar el enlace display_override, podrías alterar la forma en que la salida se envía al usuario.

De hecho, exploraremos este gancho en detalle a medida que avancemos a la siguiente sección, en la que discutiremos cómo crear un gancho personalizado.

Sobrescribir el gancho "Caché"

El gancho cache_override anula el método principal _display_cache de la clase Output. El método _display_cache es responsable de entregar la salida en caché, por lo que puedes usar este enlace si deseas entregar la salida de la página desde la ubicación del caché diferente en caso de que hayas implementado un mecanismo de almacenamiento en caché diferente.

Eso termina la historia de los diferentes puntos de gancho en el sistema de ganchos de CodeIgniter. En la siguiente sección, veremos exactamente cómo podrías aprovechar el sistema de enganches implementando un ejemplo del mundo real.

Cómo crear un gancho personalizado

Estoy seguro de que has tenido suficiente teoría hasta ahora, ¡así que volvamos a algunos desarrollos prácticos! En esta sección, crearemos un enlace personalizado para demostrar los conceptos discutidos hasta ahora en este artículo.

En nuestro caso, usaremos el gancho display_override que será responsable del reemplazo del token. Para ser más precisos, reemplazaremos todas las ocurrencias de [DATETIME] con la fecha actual. Por supuesto, eso suena como un caso de uso bastante simple, pero podrías extenderlo fácilmente para que sea más específico según tus requisitos.

De forma predeterminada, el sistema de enganches está deshabilitado en el framework principal, por lo que lo primero que debes hacer es habilitar el sistema de enganches.

Continúa y abre el archivo de configuración application/config/config.php.

Busca el siguiente fragmento y actívalo cambiando FALSE a TRUE.

1
<?php
2
/*

3
|--------------------------------------------------------------------------

4
| Enable/Disable System Hooks

5
|--------------------------------------------------------------------------

6
|

7
| If you would like to use the 'hooks' feature you must enable it by

8
| setting this variable to TRUE (boolean).  See the user guide for details.

9
|

10
*/
11
$config['enable_hooks'] = FALSE;

Ahora, estamos listos para definir nuestros ganchos. De hecho, CodeIgniter ya viene con el archivo application/config/hooks.php que puedes usar si deseas definir hooks.

De forma predeterminada, el archivo hooks.php está vacío, así que agreguemos nuestro código de enlace personalizado para hacerlo más significativo.

1
<?php
2
defined('BASEPATH') OR exit('No direct script access allowed');
3
4
$hook['display_override'] = array(
5
        'class'    => 'ReplaceToken',
6
        'function' => 'replacePlaceholderCode',
7
        'filename' => 'ReplaceToken.php',
8
        'filepath' => 'hooks'
9
);

La sintaxis para definir un gancho personalizado es bastante simple. Es la matriz $hook que contiene todos los ganchos que deben ejecutarse.

La clave de cada entrada de la matriz es el nombre del gancho que estás definiendo. Cuando estás definiendo un gancho, le estás diciendo al sistema que ejecute una determinada pieza de código cuando algo suceda. Eso es exactamente lo que debe proporcionarse como valor de cualquier gancho. Repasemos rápidamente cada clave.

  • La clave class contiene el nombre de una clase que contiene el código que debe ejecutarse.
  • La clave function contiene el nombre del método que se llamará en la ejecución del enlace.
  • La clave filename apunta al archivo que define el código de enlace completo.
  • filepath define la ruta del directorio del archivo declarado bajo la clave filename y es relativa al directorio application. Generalmente, se establece en hooks, lo que resulta como una estructura de application/hooks. Por supuesto, no hay nada que te impida definir una ruta completamente diferente si así lo deseas.

Como nota al margen, si no deseas crear un archivo de clase, también puedes proporcionar una función de cierre que se ejecutará cuando se active el gancho.

En nuestro caso, crearemos un archivo ReplaceToken.php y de acuerdo con la definición del gancho, debe colocarse en el directorio application/hooks.

Continúa y crea el archivo application/hooks/ReplaceToken.php con el siguiente contenido:

1
<?php
2
class ReplaceToken {
3
  public function replacePlaceholderCode()
4
  {
5
      // load the instance

6
      $this->CI =& get_instance();
7
      
8
      // get the actual output

9
      $contents = $this->CI->output->get_output();
10
      
11
      // replace the tokens

12
      $this->CI->load->helper('date');
13
      $contents = str_replace("[DATETIME]", standard_date(), $contents);
14
      
15
      // set the output

16
      echo $contents;
17
      return;
18
  }
19
}

El objeto de nuestro gancho es reemplazar el marcador de posición [DATETIME] con la fecha real antes de que se envíe al cliente la salida de cualquier página de nuestra aplicación.

Como hemos comentado anteriormente, la salida de la página ya está construida cuando se llama al gancho display_override. Entonces, lo primero que nos gustaría hacer es buscar la salida que está lista para enviarse al usuario.

1
// load the instance

2
$this->CI =& get_instance();
3
4
// get the actual output

5
$contents = $this->CI->output->get_output();

El método get_instance se usa para crear una instancia de la aplicación y se asigna a $this->CI. A continuación, usamos el método get_output de la clase Output para obtener el contenido de la respuesta.

El resto es bastante sencillo. El marcador de posición [DATETIME] debe reemplazarse por la fecha real. Para facilitar las cosas, el asistente date se usa para realizar la operación deseada, y casi hemos terminado en lo que respecta a nuestra lógica de enlace.

1
// replace the tokens

2
$this->CI->load->helper('date');
3
$contents = str_replace("[DATETIME]", standard_date(), $contents);

Por último, debes retornar la salida, ya que display_override anula el método _display que se utiliza para enviar la salida al cliente. Así que tenemos que hacerlo nosotros mismos en este caso; de lo contrario, habría sido manejado por el método core _display.

1
// set the output

2
echo $contents;
3
return;

De hecho, ¡eso termina la historia de nuestro gancho personalizado!

Ahora, vamos a continuar y creemos una nueva página de CodeIgniter para que podamos probar nuestro gancho personalizado. Crea un archivo de controlador application/controllers/TokenExample.php con el siguiente contenido.

1
<?php
2
defined('BASEPATH') OR exit('No direct script access allowed');
3
4
class TokenExample extends CI_Controller {
5
    public function index()
6
    {
7
        $this->load->view('token_content');
8
    }
9
}

Y así es como debería verse el archivo de vista asociado application/views/token_content.php.

1
Today's date: [DATETIME]

Y eso es todo. Apunta tu navegador a http://your-code-igniter-site-url/TokenExample/index y deberías ver el resultado esperado.

Ese es el sistema de ganchos a tu disposición si deseas ingresar al flujo de trabajo típico de la aplicación CodeIgniter. Espero que hayas disfrutado el artículo y que te ayude en el desarrollo diario de tu aplicación CodeIgniter.

Conclusión

Hoy, pasamos por una de las emocionantes funciones incorporadas de CodeIgniter: los ganchos o hooks. Los Hooks te permiten intervenir en el flujo de trabajo típico de ejecución de solicitudes de tu aplicación CodeIgniter.

Al comienzo del artículo, discutimos el concepto básico de Hooks en CodeIgniter, y luego discutimos los diferentes hooks disponibles en el sistema. Finalmente, en la última sección exploramos cómo crear un gancho personalizado y su funcionamiento interno.

No dudes en expresar tus pensamientos utilizando el feed a continuación. Además, si quieres que cubramos algún tema específico, házmelo saber.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.