laravel eloquent resources api发送状态码

时间:2017-11-15 16:00:22

标签: laravel laravel-5 laravel-5.5

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

另外,我应该如何动态设置状态,用()

定义
//namespace App\Http\Resources;

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

//class User extends Resource 

public function with($request)
{
    return [
        'status' => 'success',
    ];
}

6 个答案:

答案 0 :(得分:8)

您可以使用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);
});

答案 1 :(得分:1)

试试这个:

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

答案 2 :(得分:1)

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方法中设置状态代码

即可

答案 3 :(得分:1)

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

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

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

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

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

答案 4 :(得分:0)

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





例如,如果您使用axios发送AJAX请求,则只需要执行类似的操作。




  axios.get('/ path / to /get/your/data/').
然后(函数(响应){
 // response.status将代表您的状态代码
});
  




因此,当您在控制器中使用 abort(404); 时,状态代码将为404.当您遇到内部错误(代码500)时,您将获得500作为响应代码。




答案 5 :(得分: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);
}