ACTION FO+BO Desde 1.5

actionDispatcher

~3 min de lectura

#Descripcion

Se ejecuta al inicio del Dispatcher, antes de que se procese cualquier peticion HTTP. Permite interceptar, redirigir o modificar cualquier peticion entrante a la tienda. Es el hook mas temprano del ciclo de vida de una peticion PrestaShop — se ejecuta antes que cualquier controlador. Ideal para firewalls, geo-blocking, redirects globales, mantenimiento custom y logging de accesos.

📍
Disparado por
  • DispatcherCore::dispatch()classes/Dispatcher.php

#Parametros

Nombre Tipo Requerido Descripcion
$controller_type int Si Tipo de controlador: 1=Front, 2=Back, 3=Module
$controller_class string Si Nombre de la clase del controlador que se va a ejecutar
$is_module bool No Si el controlador pertenece a un modulo
Retorno
void No se espera valor de retorno

#Ejemplo de codigo

mymodule.php
php
public function install()
{
    return parent::install()
        && $this->registerHook('actionDispatcher');
}
mymodule.php
php
/**
 * Hook actionDispatcher — Firewall basico + geo-blocking
 */
public function hookActionDispatcher($params)
{
    $controller = $params['controller_class'] ?? '';
    $type = (int)($params['controller_type'] ?? 0);

    // Solo aplicar en el front office (type=1)
    if ($type !== 1) {
        return;
    }

    // Obtener IP del visitante
    $ip = Tools::getRemoteAddr();

    // Comprobar si la IP esta bloqueada
    $blocked = Db::getInstance()->getValue(
        'SELECT COUNT(*) FROM `' . _DB_PREFIX_ . 'mymodule_blocked_ips`
         WHERE ip = \'' . pSQL($ip) . '\''
    );

    if ($blocked) {
        header('HTTP/1.1 403 Forbidden');
        die('Acceso denegado');
    }

    // Logging de accesos
    Db::getInstance()->insert('mymodule_access_log', [
        'ip'         => pSQL($ip),
        'controller' => pSQL($controller),
        'uri'        => pSQL(Tools::getCurrentUrlProtocolPrefix() . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']),
        'date_add'   => date('Y-m-d H:i:s'),
    ]);
}

#Notas y gotchas

  • ⚠️ Este hook se ejecuta MUY temprano — el contexto puede no estar completamente inicializado.
  • ⚠️ No uses `$this->context->customer` aqui — puede no existir aun. Usa `Tools::getRemoteAddr()` y cookies directamente.
  • ⚠️ Se ejecuta en CADA peticion (front + back + API). Filtra siempre por `controller_type` para no bloquear el admin.
  • ⚠️ Evita operaciones pesadas (queries a BD, APIs externas) — este hook impacta el tiempo de carga de TODA la tienda.
  • ⚠️ Tambien existen `actionDispatcherBefore` (antes) y `actionDispatcherAfter` (despues) como alternativas.

#Relacionados

#Historial de versiones

Version PSCambio
1.5 Introducido como punto de interceptacion del Dispatcher
1.6 Añadidos actionDispatcherBefore y actionDispatcherAfter
Descargar en Markdown Pensado para pegar en ChatGPT, Claude u otra IA. Incluye solo el contenido de esta pagina.