laravel eloquent resources api 发送状态码

问题描述 投票:0回答:7

在 Laravel 5.5 中我们可以通过资源来设置 API (https://laracasts.com/series/whats-new-in-laravel-5-5/episodes/20),但是我们如何发送 STATUS CODE 呢?

另外我应该如何动态设置在 with() 中定义的状态

//namespace App\Http\Resources;

//use Illuminate\Http\Resources\Json\Resource;

//class User extends Resource 

public function with($request)
{
    return [
        'status' => 'success',
    ];
}
laravel laravel-5 laravel-5.5
7个回答
36
投票

您可以使用

setStatusCode()
中的方法
response()

use App\User;
use App\Http\Resources\User as UserResource;

Route::get('/user', function () {
    return (new UserResource(User::find(1)))
               ->response()
               ->setStatusCode(200);
});

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

}

只需在 withResponse 方法中设置状态代码


2
投票

试试这个:

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

}

在控制器:

$resource = new UserResource($user);
return $resource->response()->setStatusCode(200);

1
投票

您可以轻松地在资源中设置响应状态代码,如下面的代码。

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

如果您正在处理数据集合,请使用集合类型而不是资源,如下面的代码。

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

然后在您的控制器中使用它。


0
投票

我更喜欢重写 toResponse() 方法并添加 ->setStatusCode(401) ;

public function toResponse($request)
{
    return (new ResourceResponse($this))->toResponse($request)->setStatusCode(401);
}

如果你想要动态状态代码,你可以重写 __constructor 并向类添加属性

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

0
投票

资源:

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

行动:

public function show(Product $product)
{
    return (new ProductResource($product))
        ->setStatusCode(200)
        ->response()
        ->setStatusCode(200);
}

-3
投票

默认情况下,HTTP 响应包含状态代码。因此您不必在发送/接收的数据中获取它,而是在 HTTP 响应标头中获取它。

例如,如果您使用 axios 发送 AJAX 请求,您只需要做类似的事情..

axios.get('/path/to/get/your/data/').
  then(function(response) {
    // response.status will represent your status code
});

因此,当您在控制器中使用

abort(404);
时,状态代码将为 404。当您出现内部错误(代码 500)时,您将获得 500 作为响应代码。

© www.soinside.com 2019 - 2024. All rights reserved.