【问题标题】:laravel eloquent resources api send status codelaravel eloquent 资源 api 发送状态码
【发布时间】:2017-11-15 16:00:21
【问题描述】:

在 Laravel 5.5 中我们可以通过资源 (https://laracasts.com/series/whats-new-in-laravel-5-5/episodes/20) 设置 API,但是如何发送 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


    【解决方案1】:

    可以使用response()中的setStatusCode()方法:

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

    【讨论】:

    • 这是迄今为止最好的方式。我不明白为什么有人会在 Resource 类本身中设置响应代码。这将是动态的,确定返回状态的逻辑不属于那里。它属于创建/编辑/删除/任何逻辑所在的控制器。谢谢。
    【解决方案2】:
    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】:

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

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

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

      【讨论】:

        【解决方案4】:

        试试这个:

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

        【讨论】:

        • API资源中是否有空请求处理?
        • 这里应该使用可选方法:return[ 'name' =>optional( $this->username), 'email'=> optional($this->email) ];
        【解决方案5】:

        默认情况下,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 作为响应代码。

        【讨论】:

        • 我没有使用 ajax 我也必须发送 201、403 之类的代码
        • 你用它做什么?我想你也可以用它
        【解决方案6】:

        我更喜欢重写 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);
        }
        

        【讨论】:

          猜你喜欢
          • 2020-04-22
          • 1970-01-01
          • 2019-02-14
          • 2020-07-04
          • 2019-08-25
          • 1970-01-01
          • 1970-01-01
          • 2022-11-05
          • 1970-01-01
          相关资源
          最近更新 更多