Reputation: 159
In Laravel 5.5 We can set API through resources (https://laracasts.com/series/whats-new-in-laravel-5-5/episodes/20), but how can we send STATUS CODE?
Also how should I set status dynamically which is defined in with()
//namespace App\Http\Resources;
//use Illuminate\Http\Resources\Json\Resource;
//class User extends Resource
public function with($request)
{
return [
'status' => 'success',
];
}
Upvotes: 15
Views: 18457
Reputation: 11
resource:
class ProductResource extends JsonResource
{
private int $status_code = 200;
/**
* Transform the resource into an array.
*
* @return array<string, mixed>
*/
public function toArray(Request $request): array
{
return [
'status_code' => $this->status_code,
'data' => parent::toArray($request),
];
}
public function setStatusCode(int $statusCode): self
{
$this->status_code = $statusCode;
return $this;
}
}
action:
public function show(Product $product)
{
return (new ProductResource($product))
->setStatusCode(200)
->response()
->setStatusCode(200);
}
Upvotes: 1
Reputation: 970
you can easily set response status code in a resource like code bellow.
class CreateUserResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return parent::toArray($request);
}
/**
* @param \Illuminate\Http\Request $request
*
* @return \Illuminate\Http\JsonResponse|object
*/
public function toResponse($request)
{
return parent::toResponse($request)->setStatusCode(201);
}
}
and if you are dealing with a collection of data use Collection type instead of a resource, like the code bellow.
class CreateUserCollection extends ResourceCollection
{
/**
* Transform the resource collection into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return parent::toArray($request);
}
/**
* @param \Illuminate\Http\Request $request
*
* @return \Illuminate\Http\JsonResponse|object
*/
public function toResponse($request)
{
return parent::toResponse($request)->setStatusCode(201);
}
}
and then use it in your controllers.
Upvotes: 2
Reputation: 4398
I prefer to override toResponse() method and add ->setStatusCode(401) to that;
public function toResponse($request)
{
return (new ResourceResponse($this))->toResponse($request)->setStatusCode(401);
}
And if you want to have dynamic status code you can override __constructor and add a property to the class
public $statusCode;
public function __construct($resource, $statusCode = 401)
{
parent::__construct($resource);
$this->statusCode = $statusCode;
}
public function toResponse($request)
{
return (new ResourceResponse($this))->toResponse($request)->setStatusCode($this->statusCode);
}
Upvotes: 0
Reputation: 3580
You can use the method setStatusCode()
from response()
:
use App\User;
use App\Http\Resources\User as UserResource;
Route::get('/user', function () {
return (new UserResource(User::find(1)))
->response()
->setStatusCode(200);
});
Upvotes: 38
Reputation: 635
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\Resource;
class UserFail extends Resource{
/**
* Customize the outgoing response for the resource.
*
* @param \Illuminate\Http\Request
* @param \Illuminate\Http\Response
* @return void
*/
public function withResponse($request, $response)
{
/**
* Not all prerequisites were met.
*/
$response->setStatusCode(428, 'Precondition Required');
}
public function with($request){
return [
'status'=>'failed'
];
}
}
just set your status code in your withResponse method
Upvotes: 10
Reputation: 96
try this:
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\Resource;
class User extends Resource{
public function toArray($request)
{
return[
'name' => $this->username,
'email'=> $this->email
];
}
public function with($request){
return [
'status'=>'success'
];
}
}
At Controller:
$resource = new UserResource($user);
return $resource->response()->setStatusCode(200);
Upvotes: 2
Reputation: 576
By default, HTTP responses include a status code.. So you don't have to get it in data sent/received but in the HTTP response headers.
For example, if you are using axios to send AJAX requests, you will just have to do something like..
axios.get('/path/to/get/your/data/').
then(function(response) {
// response.status will represent your status code
});
So when you use abort(404);
in your controller, the status code will be 404. And when you have an internal error (code 500) you will get 500 as response code.
Upvotes: -3