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 PS | Cambio |
|---|---|
| 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.