El problema
El CMS que estoy escribiendo tiene soporte para múltiples blogs en un site. Cada blog puede tener su theme asociado. Para saber qué blog se está viendo actualmente se guardan sus datos en la sesión siempre que la URL solicitada lo implique (básicamente ver la página principal de un blog o uno de sus posts).
Simplemente hay que consultar la variable de sesión y obtener el theme del blog en cuestión. Lo mejor es hacerlo en el AppController.
Fallo 1: poner ese código en el beforeFilter.
Es un fallo porque el blog actual puede cambiar durante la acción y la sesión ya no la volvemos a leer hasta el próximo clic del usuario.
Y lo peor es que esa acción puede suponer que si ese siguiente clic nos lleva a otro blog, éste coge el tema del blog que acabamos de abandonar y nos hace alucinar en colores.
Consejo: Si prepara cosas para la acción, ponlo en beforeFilter, si utiliza cosas generadas por la acción, ponlo en beforeRender.
Fallo 2: no llamar a papá
El sitio lógico para poner el cambio de theme es beforeRender porque así se ha ejecutado la acción y si ha cambiado el blog actual el código puede enterarse. Como beforeRender se ejecuta justo antes de empezar a dibujar la vista, ocurre que ésta ya aplica el nuevo theme.
Pero si los Controllers tienen su propio beforeRender debes asegurarte de llamar en ellos al parent::beforeRender() porque si no te saltas el código encargado de determinar si hay que cambiar el theme para las vistas.
Consejo general: siempre que escribas un callback en un controller llama a la función equivalente en parent, o por lo menos, piensa si tendrías que llamarla.
Fallo extra. Controla los nombres de variables
Este fallo me ha tenido varios días detenido. En un behavior utilizaba una variable cuyo nombre era igual que el del parámetro por el que CakePHP pasa la referencia del modelo. Por supuesto, se iba todo a tomar por el saco.
La cuestión curiosa es que ese código funciona bien sobre PHP 5, pero provoca un error fatal en PHP4.