Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 什么是';正确的道路';是否授权此REST API请求?_Php_Api_Rest_Laravel - Fatal编程技术网

Php 什么是';正确的道路';是否授权此REST API请求?

Php 什么是';正确的道路';是否授权此REST API请求?,php,api,rest,laravel,Php,Api,Rest,Laravel,我正在构建一个restapi,我坐在这里有一个问题。我决不是这方面的专家,所以我想学习如何以“正确的方式”(或者至少以有意义的方式)处理REST架构 我正在构建一个具有角度前端和基于laravel的RESTfull后端API的web应用程序。该应用程序有以下3个表格:相册、帖子和评论。如果用户是相册的成员,则可以在相册中撰写帖子 用户可以被邀请成为相册的成员,然后查看它的所有帖子和这些帖子的评论。如果用户不是(被邀请成为)相册的成员,则不能对该相册中的帖子发表评论 换句话说:如果用户对帖子发表评

我正在构建一个restapi,我坐在这里有一个问题。我决不是这方面的专家,所以我想学习如何以“正确的方式”(或者至少以有意义的方式)处理REST架构

我正在构建一个具有角度前端和基于laravel的RESTfull后端API的web应用程序。该应用程序有以下3个表格:相册、帖子和评论。如果用户是相册的成员,则可以在相册中撰写帖子

用户可以被邀请成为相册的成员,然后查看它的所有帖子和这些帖子的评论。如果用户不是(被邀请成为)相册的成员,则不能对该相册中的帖子发表评论

换句话说:如果用户对帖子发表评论,帖子必须来自用户所属的相册

我的困境是:如何检查/授权此请求?

我雄辩的人际关系如下:

  • 用户表与相册具有多对多关系
  • 相册有很多帖子
  • 帖子有很多评论
传入请求是具有2个参数的POST请求:

  • 相册\u id(帖子所在的相册)
  • post_id(用于正在评论的帖子)
  • 正文(实际注释本身)
文章的作者通过Auth::user()检索

我对解决这个问题的初步想法是:

  • 我检查用户所属的所有相册
  • 构建用户所属的已找到相册的所有ID的数组
  • 检查post_id参数是否在该数组中
  • 如果不是,用户不能评论,如果是,用户可以评论
  • 到目前为止,我的代码是:

    // Validate the Request Body
    $input = $this->request->only([ 'album_id', 'post_id', 'comment' ]);
    
    $validator = Validator::make( $input, [
    
        'album_id'  => 'required|integer',
        'post_id'   => 'required|integer',
        'comment'   => 'required',
    
    ]);
    
    // Authorize the Request
    $albumIdList = Auth::user()->albums()->get()->pluck('id')->toArray();
    
    $postIdList = Post::whereIn( 'album_id', $albumIdList )->select('id')->get()->toArray();
    
    if( ! in_array($this->request->get('post_id'), $albumIdList))
        return abort(403);
    
    // Store the new comment
    $comment = Comment::create([
    
        'user_id'   => Auth::user()->id,
        'post_id'   => $input['post_id'],
        'comment'   => $input['comment'],
    
    ]);
    
    return $comment;
    
    我认为这是正常工作,但如果一张专辑有1000个帖子呢?为服务器构建包含所有post ID的阵列变得非常密集。。。专业公司(如Facebook、Twitter、Pinterest)如何在其web应用程序中解决这一问题

    提前谢谢

    您正在查找和
    存在的
    方法:

    $allowed=Auth::user()->albums()->whereHas('post',function($query){
    $query->where($this->request->only('post_id'));
    })->存在();
    

    此外,没有理由传入
    相册\u id
    。您的代码可以简化为:

    $this->validate($this->请求)[
    'post_id'=>'必需|整数',
    '注释'=>'必需',
    ]);
    $allowed=Auth::user()->albums()->whereHas('posts',函数($query){
    $query->where($this->request->only('post_id'));
    })->存在();
    如果(!$允许),返回中止(403);
    $input=$this->request->only('post_id','comment');
    返回Comment::create($input+['user_id'=>Auth::id());
    

    如果你想进一步清理这件事,你应该看看拉威尔的