2015-10-05 49 views
4

到目前为止,我可以允许用户编辑他自己的帖子,但每当我通过if he's owner of the subreddit/category条件,它就停止工作共。Laravel 5:允许用户编辑帖子,如果他是帖子的所有者或论坛类别的所有者

我有这3台

Users: id, name, email... 
Subreddits: id, name, user_id... 
Posts: id, link, title, user_id, subreddit_id... 

这是PostsController.php

public function edit(Post $post, Subreddit $subreddit) 
    { 
     if(Auth::id() !== $post->user_id) { 
      return view('home')->withErrors('You cannot do that'); 
     } else { 
      return view('post/edit')->with('post', $post)->with('subreddit', $subreddit); 
     } 
    } 

edit()方法和本所认为

@if(Auth::id() == $post->user_id) 
     <a href="{{ action('[email protected]', [$post->id]) }}">Edit</a> 
@endif 

这工作得很好,它只是检查登录的user_id与帖子的user_id和更新相同穿过去。

但是如果我加了if(Auth::id() == $subreddit->user_id)就停止工作。它会在所有帖子的视图上显示“编辑”链接,但点击其中的任何一个都会给我提供验证错误You cannot do that,即使是我拥有的帖子。

那么如何检查用户是文章的所有者还是要显示并允许编辑的类别的所有者呢?

$subreddit->user_id

public function edit(Post $post, Subreddit $subreddit) 
    { 
     if(Auth::id() == $post->user_id || Auth::id() == $subreddit->user_id) { 
      return view('post/edit')->with('post', $post)->with('subreddit', $subreddit); 
     } else { 
      return view('home')->withErrors('You cannot do that'); 
     } 
    } 

查看更新的方法

@if(Auth::id() == $post->user_id || Auth::id() == $subreddit->user_id) 
     <a href="{{ action('[email protected]', [$post->id]) }}">Edit</a> 
@endif 

这将让我修改我的文章,但仍会给我验证错误You cannot do that上的帖子在我自己的论坛类/版(Subreddit) 。

这是我试过的Gate政策,但它也没有工作

class AuthServiceProvider extends ServiceProvider 
{ 
    // Authorizations and Permissions 
    public function boot(GateContract $gate) 
    { 
     parent::registerPolicies($gate); 

     $gate->define('update-post', function ($user, $post) { 
       return $user->id === $post->user_id; 
     }); 

     $gate->define('mod-update-post', function ($user, $subreddit) { 
      return $user->id === $subreddit->user_id; 
     }); 
    } 

PostsController.php

public function edit(Post $post, Subreddit $subreddit, User $user) 
    { 
     if(Gate::denies('update-post', $post) && Gate::denies('mod-update-post', $subreddit)) { 
     return view('home')->withErrors('You cannot do that'); 
    } else { 
     return view('post/edit')->with('post', $post)->with('subreddit', $subreddit); 
    } 
    } 

查看

@can('update-post', $post) 
    <a href="{{ action('[email protected]', [$post->id]) }}">Edit</a> 
@endcan 

与上面的代码,如果'update-post'为true,我终于可以编辑帖子,但我无法检查是否mod-update-post也是如此,我不断收到验证错误You cannot do this

dd($subreddit) inside edit()方法显示一个空数组。 https://cryptbin.com/x6V6wX#26810f755a62f6c8837c0c0fe0371dcf

编辑:我想我解决了它。我用$post->subreddit->user->id而不是$subreddit->user_id,因为那是返回null。现在,似乎所有工作都基于帖子是属于用户还是用户是论坛所有者。

但视图上的编辑链接仍然显示我是否有权访问。我无法同时检查update-postmod-update-post。而使用@can('update-post', $post)只能工作一次,我不能再仔细检查一下。

+0

调查政策:http://laraveldaily.com/laravel-5-1-11-introduces-acl-system/ –

+0

“但如果我添加if(Auth :: id()== $ subreddit-> user_id )“:我没有得到你添加这个的地方。请显示修改后的代码片段。 – bernie

+0

我尝试了'Gate'外观,但是我无法在视图上检查两个'@ can',所以我恢复为检查它的默认方式。我有确切的门政策,检查'$ user-> id === $ post-> user_id',但是当我添加第二个门检查是否$ user-> id === $ subreddit-> user_id'它停止工作,并开始像我在原来的帖子中描述的那样行事。 – Halnex

回答

2

那么如何检查用户是文章的所有者还是要显示并允许编辑的类别的所有者呢?

使用Laravel的新authorization component

编辑:我认为你误解了应该如何使用授权。它应该用于检查当前用户是否可以执行操作(或不)。因此,您不希望为不同的用户类型定义多种方法。

以编辑帖子为例。有您的授权检查的名称:@can('edit', $post)。您不需要为常规用户定义不同的副本,而为主持人定义另一个副本。只需将逻辑添加到您的编辑岗位方法:

class PostPolicy 
{ 
    public function edit(User $user, Post $post) 
    { 
     // If user is administrator, then can edit any post 
     if ($user->isModerator()) { 
      return true; 
     } 

     // Check if user is the post author 
     if ($user->id === $post->author_id) { 
      return true; 
     } 

     return false; 
    } 
} 

正如你所看到的,我做的不同的检查中同样的方法,所以在您的刀片模板你可以这样做:

@can('edit', $post) 
    <a href="{{ route('post.edit', $post->getRouteKey()) }}">Edit post</a> 
@endcan 

希望这可以解决问题。

+0

我以前试过,我添加了一个新的策略'mod-update-post',它会返回$ user-> id === $ subreddit-> user_id;'但我无法检查两个'@can '在视图上,我发现没有关于这个问题的文件。 – Halnex

+0

这是因为您应该为您检查的内容定义角色,而不是将它们组合起来,即'@can('edit',$ post)'。只需在您的策略中对该方法执行两次布尔检查,而不是尝试在视图中合并检查(您不应该这样做)。 –

+0

我编辑了我的帖子并添加了我的门策略,但仍无法正常工作。我现在可以在我的帖子上看到编辑链接,但无法编辑它们,导致验证错误。 – Halnex

相关问题