到目前为止,我可以允许用户编辑他自己的帖子,但每当我通过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-post
和mod-update-post
。而使用@can('update-post', $post)
只能工作一次,我不能再仔细检查一下。
调查政策:http://laraveldaily.com/laravel-5-1-11-introduces-acl-system/ –
“但如果我添加if(Auth :: id()== $ subreddit-> user_id )“:我没有得到你添加这个的地方。请显示修改后的代码片段。 – bernie
我尝试了'Gate'外观,但是我无法在视图上检查两个'@ can',所以我恢复为检查它的默认方式。我有确切的门政策,检查'$ user-> id === $ post-> user_id',但是当我添加第二个门检查是否$ user-> id === $ subreddit-> user_id'它停止工作,并开始像我在原来的帖子中描述的那样行事。 – Halnex