Alex
Alex

Reputation: 7688

Laravel won't obey status code

I just can't understand, and don't know where else to look, as the response status code of the following code is always 200, even if I set it to 400 in the main Response class.

class Api_Controller extends Base_Controller
{

    public function __construct()
    {
          parent::__construct();

          //header("HTTP/1.0 404 Not Found"); ##> This works
          //die();

          $test = array('1' => '2');
          die(Response::json($test, 400));
    }

What am I missing? I'm not using any extended class, just the default...

Update

This is the output of the Response::json... above: http://pastebin.com/RGcinSdg

As you can see, the output has the values that has been set... but still for some reason, returns 200

Update2

The output of var_dump(http_response_code()); is always 200

Update3 - Temporary fix

I have activated an extended version of Response::json and add the following line to it

http_response_code($status);

But I would still much like to know why doesn't it does it, the way it should

Upvotes: 6

Views: 20424

Answers (6)

Hesham AbdAllah
Hesham AbdAllah

Reputation: 412

We had the same problem and we found that there was an extra empty line before the opening <?php tag.. try to search on the following: Please note there is an empty space before the opening tag.


<?php

HTTP Headers Must Be Sent First: In HTTP, headers must be sent before any actual content. PHP uses the header() function to manipulate these HTTP headers (like status codes). If any output (including white space or new lines) precedes calls to header(), PHP will send the output along with default HTTP headers first, making it impossible to modify the headers afterward.

Upvotes: 0

Jannie Theunissen
Jannie Theunissen

Reputation: 30114

Try the response()->json() syntax.

So, for example, to flag validation error from a custom FormResquest, you can do this:

/**
 * Get validation response for the request.
 *
 * @param  array $messages
 * @return \Symfony\Component\HttpFoundation\Response
 */
public function response(array $messages)
{
    return response()->json($messages, 422);
}

Upvotes: 3

user2436802
user2436802

Reputation: 15

To keep Google Webmaster Tools happy I detect and use the following in the header:

META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW"

Upvotes: 0

ecunado
ecunado

Reputation: 101

The same problem happens if you forget the return statement:

Response::json(array(
   'error' => true,
   'msg' => 'Bad request'
), 403);

instead of:

return Response::json(array(
   'error' => true,
   'msg' => 'Bad request'
), 403);

Upvotes: 3

Oddman
Oddman

Reputation: 3959

You can't return responses from controller constructors - it just doesn't fit with the flow of the request lifecycle in Laravel.

There's two ways to do this. You can either:

a) Setup a response filter that handles whatever functionality it is you're trying to achieve or b) Force a controller ACTION to return a response. This would be done like so:

class Api_Controller extends Base_Controller
{
    public $restful = true;

    public function get_index()
    {
        return Response::json($test, 400);
    }
}

It DOES work - you're just doing it incorrectly :)

Upvotes: 13

bstrahija
bstrahija

Reputation: 518

Controller methods always have to return responses. But I don't think you can return a response from the constructor. You would need to use a filter.

Upvotes: 0

Related Questions