user7498776
user7498776

Reputation: 159

laravel eloquent resources api send status code

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

Answers (7)

oseias isidoro
oseias isidoro

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

adnan ahmady
adnan ahmady

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

Ali Sharifi Neyestani
Ali Sharifi Neyestani

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

Samuel Martins
Samuel Martins

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

Oliver Maslo
Oliver Maslo

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

Ashish Dadhich
Ashish Dadhich

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

Medteck
Medteck

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

Related Questions