0
votes

I have create my own 404 error handler editing laravel 4's /app/start/global.php file as below:

App::error(function(Exception $exception, $code)
{
    Log::error($exception);

    if (Config::get('app.debug')) {
        return;
    }

    switch ($code)
    {
        case 403:
        case 404:
        case 500:
            $view = App::make('PublicController')->callAction('error', array($code));
            $response = Response::make($view, $code);
            return $response;
            break;

        default:
            return Response::view('errors.default', array(), $code);
            break;
    }
});
  1. Because of the use a template library, I must delagate the view style across a specific controller. So, I get a nice style with this line:

    $view = App::make('PublicController')->callAction('error', array($code));
    
  2. Because of the application needs a status code for browser request, I build it with Response::make using the html view rendered as Response's content and then, return it:

    $response = Response::make($view, $code);
    return $response;
    

The workflow follows the thread really good and the 404 html view is showed correctly according to the layout, the 404 status is set also good. But, what's the problem here? well.. for some reason, there is an "echo" at html output, like below:

HTTP/1.0 200 OK
Cache-Control: no-cache
Date:          Tue, 08 Apr 2014 18:21:44 GMT

<!DOCTYPE html>
<html lang="en">

    <head>
    <meta charset="utf-8"> 

    ...

If you note, there is a message at the beginning:

HTTP/1.0 200 OK Cache-Control: no-cache Date: Tue, 08 Apr 2014 18:21:44 GMT

Looks like Response::make function has an echo within, because if I do:

$view = App::make('PublicController')->callAction('error', array($code));
return $view;

... the message disapears, but I do not like this answer because I need to use Response class in order to set the status code. How can I dealing with this?

1
Why don't you use App::missing method for custom 404's?Aristona
Let me seek for more information about it.manix

1 Answers

2
votes

I also encountered this problem and resolved. I hope this will help you.

$view = App::make('PublicController')->callAction('error', array($code));
return Response::make($view->__toString(), $code);