Firing cakePHP components callbacks on error404
06 Jan 2011I often use $this->cakeError('error404') in my controllers to stop processing the request (and return a 404 error) when the supplied parameters are buggy or incomplete.
A strange side effect
I recently spotted a strange side effect on the latest site I was developping. It used a pretty large html footer filled with links dynamically fetched from my database.
As all pages (no matter what model/controller they were refering to) were using the same footer, I created a component with a simple startup method to fetch them all and return them to the view. I added this component to my AppController so that every controller will inherit it.
This worked nicely until I spotted that on error pages, the footer was left mostly empty. I was because my Component callback was never fired.
How's that ?
When detecting an error, cake starts using its ErrorHandlerand thus do not fire callbacks.
Fortunatly, you can create an AppErrorclass (in app/app_error.php) and overwrite the ErrorHandlermethod. Namely, the error404. I rewrote mine to explicitly fire the initialize and startup methods.
class AppError extends ErrorHandler {
function error404($params) {
$this->controller->Component->initialize($this->controller);
$this->controller->Component->startup($this->controller);
parent::error404($params);
}
}
I only fired two of the callbacks, but maybe beforeRenderand shutdownshould be fired too.
Want to add something ? Feel free to get in touch on Bluesky : @pixelastic.bsky.social