Reputation: 7688
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...
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
The output of var_dump(http_response_code());
is always 200
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
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
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
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
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
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
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