13

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',
    ];
}
user7498776
  • 139
  • 1
  • 1
  • 5

6 Answers6

34

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);
});
Samuel Martins
  • 3,540
  • 1
  • 11
  • 11
  • 2
    This is by far the best way here. I don't understand why anyone would set the response code in the Resource class itself. It's going to be dynamic, and the logic to determine the return status doesn't belong there. It belongs in the controller where the create/edit/delete/whatever logic lives. Thanks. – Joel Mellon Apr 04 '22 at 20:08
9
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

Oliver Maslo
  • 578
  • 5
  • 4
2

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

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.

adnan ahmady
  • 770
  • 1
  • 7
  • 12
0

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);
}
Ali Sharifi Neyestani
  • 4,162
  • 1
  • 14
  • 22
-3

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.

Medteck
  • 496
  • 4
  • 12