laravel eloquent resources api send status code

Viewed 13087

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',
    ];
}
6 Answers
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

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);

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.

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);
}

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.

Related