在 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',
];
}
您可以使用
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);
});
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 方法中设置状态代码
试试这个:
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);
您可以轻松地在资源中设置响应状态代码,如下面的代码。
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);
}
}
然后在您的控制器中使用它。
我更喜欢重写 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);
}
资源:
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);
}
默认情况下,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 作为响应代码。