He trabajado con CakePHP 1.3, pero esta es mi primera incursión en las excepciones de CakePHP 2.0 y PHP, así que tengan paciencia si mi pregunta parece prolija.CakePHP 2.0 - beforeFilter() no se ejecuta en cakeErrorController?
En mis AppController
's beforeFilter()
puse un par de variables a través de $this->set()
para su uso en mi plantilla de vista.
En mi UsersController
tengo código que se ve más o menos así:
public function beforeFilter() {
parent::beforeFilter();
if (userDeniedAccess()) {
throw new ForbiddenException();
}
}
donde la función hipotética userDeniedAccess()
encapsula mis comprobaciones de autorización.
Todo funciona bien, y obtengo el error 403 cuando lo espero. Sin embargo, cuando se lanza la excepción, las variables de vista que se establecieron en AppController::beforeFilter()
ya no están configuradas, lo que provoca errores en mi plantilla de vista. Cuando se lanza la excepción no, las variables se establecen correctamente.
Puedo codificar las variables faltantes si es necesario, pero realmente me gustaría saber qué causa este comportamiento. Tanto mi UsersController
como CakeErrorController
extienden AppController
. Naturalmente, espero que cuando se lanza la excepción y se instancia el CakeErrorController
, genere las mismas variables de vista para mí.
Sin embargo, parece que el método Controller::startupProcess()
(que incluye la llamada a beforeFilter()
) nunca se llama en CakeErrorController
. Según tengo entendido, el despachador lo hace para solicitudes regulares, pero el ciclo de vida del controlador de errores es diferente.
He visto descripciones (like this one) de comportamiento similar en CakePHP 1.3, pero por supuesto el código de manejo de error de CakePHP ha sido completamente revisado en 2.0.
Así que o bien:
- Esto es un error en el manejo de excepciones por defecto de CakePHP,
- el comportamiento es como se pretende y yo no lo entiendo, o
- Me estoy volviendo loco.
Sé que no puede ayudar con el caso 3, pero si aplica alguno de los dos primeros, agradecería la opinión de alguien que sabe más que yo.
Gracias!
EDITAR: Establecer las variables de vista en beforeRender()
resuelve mi problema. Sin embargo, todavía me pregunto si es intencional que beforeFilter()
nunca se llame en CakeErrorController
.
+1 para el autodiagnóstico "Yo podría estar loco". –