Firing cakePHP components callbacks on error404

I 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.


Tags : #errorhandler, #apperror, #cakephp, #component, #error404, #errors, #cakeerror

Want to add something ? Feel free to get in touch on Twitter : @pixelastic