我正在尝试在帖子的评论列表中实现授权门。我认为我做对了,因为它可以正常工作。
如果用户是评论的所有者或者是该评论所在 subreddit 的版主,则可以编辑评论。否则,他将无法看到编辑链接(我正在使用 X-Editable 进行内联编辑)。
一切都很顺利,直到我提交新评论时,就会出现以下错误。但是,由于可以在刷新后看到它已经提交到数据库中,所以评论已经提交成功。
“comment_list.blade.php”上未定义变量:isModerator 显然,我需要将 isModerator 变量传递给视图,所以我这样做了。
视图的编辑部分如下所示。
如果用户是评论的所有者或者是该评论所在 subreddit 的版主,则可以编辑评论。否则,他将无法看到编辑链接(我正在使用 X-Editable 进行内联编辑)。
一切都很顺利,直到我提交新评论时,就会出现以下错误。但是,由于可以在刷新后看到它已经提交到数据库中,所以评论已经提交成功。
“comment_list.blade.php”上未定义变量:isModerator 显然,我需要将 isModerator 变量传递给视图,所以我这样做了。
$isModerator = $post->subreddit->moderators->where('user_id', Auth::id())->exists();
页面加载时出现此错误,整个帖子页面崩溃。
Illuminate\Database\Eloquent\Collection::exists() 方法未定义
位于 PostsController.php 第90行的 CommentController::view_data()
这是我的 Gate
授权。请注意,update-post
和 update-sub
没有任何问题。
public function boot(GateContract $gate)
{
parent::registerPolicies($gate);
$gate->define('update-comment', function($user, $comment, $isModerator) {
if($user->id === $comment->user_id) {
return true;
}
if ($isModerator) {
return true;
}
});
$gate->define('update-post', function ($user, $post, $isModerator) {
if ($user->id === $post->subreddit->user->id) {
return true;
}
if ($user->id === $post->user_id) {
return true;
}
if ($isModerator) {
return true;
}
return false;
});
$gate->define('update-sub', function($user, $subreddit) {
if($user->id === $subreddit->user->id) {
return true;
}
return false;
});
}
CommentController
中的view_data()
方法。public static function view_data(Request $request, Post $post) {
$instance = new Self;
$per_page = session('per_page')?session('per_page'):config('constants.per_page');
$post = Post::with('user.votes')->with('subreddit.moderators')->with('comments')->where('id', $post->id)->first();
$comment = $post->comments;
$user = User::where('id', '=', Auth::id())->get();
$isModerator = $post->subreddit->moderators->where('user_id', Auth::id())->exists();
$result['per_page'] = $per_page;
$result['comments'] = $instance->comment_list($per_page, $request, $post, $comment, $user, $isModerator);
$result['total_comments'] = $instance->total_comments($post);
return $result;
}
视图的编辑部分如下所示。
@can('update-comment', [$each_comment, $isModerator])
<p>
<a href="#" class="testedit" data-pk="{{ $each_comment->id }}" data-url="{{ url($each_comment->post_id . '/comment/update') }}">
{!! $each_comment->comment !!}
</a>
</p>
@else
<p>
{!! $each_comment->comment !!}
</p>
@endcan
这是 PostsController
中的 show()
方法。
public function show(Post $post, User $user, Request $request, Comment $comment)
{
$post = Post::with('user.votes')->with('subreddit.moderators')->findOrFail($post->id);
$ids = $post->subreddit;
$isModerator = $ids->moderators()->where('user_id', Auth::id())->exists(); // this is line 90
$modList = Moderator::where('subreddit_id', '=', $post->subreddit->id)->get();
$view_data = CommentController::view_data($request, $post, $comment, $isModerator);
return view('post/show', $view_data)->with('post', $post)
->with('modList', $modList)
->with('isModerator', $isModerator);
}
关系
Comment
模型
public function posts() {
return $this->belongsTo('App\Post');
}
public function user() {
return $this->belongsTo('App\User');
}
public function commentvotes() {
return $this->hasMany('App\CommentVote');
}
Post
模型
public function user() {
return $this->belongsTo('App\User');
}
public function subreddit() {
return $this->belongsTo('App\Subreddit');
}
public function votes() {
return $this->hasMany('App\Vote');
}
public function moderators() {
return $this->hasMany('App\Moderator');
}
public function comments() {
return $this->hasMany('App\Comment');
}
Subreddit
模型
public function user() {
return $this->belongsTo('App\User');
}
public function posts() {
return $this->hasMany('App\Post');
}
public function moderators() {
return $this->hasMany('App\Moderator');
}
Moderator
Model
public function subreddit() {
return $this->belongsTo('App\Subreddit');
}
public function user() {
return $this->belongsTo('App\User', 'user_id');
}
public function posts() {
return $this->belongsTo('App\Post');
}
$isModerator = $ids->moderators()->where('user_id', Auth::id())->first()
,然هگژè؟گè،Œdd($moderators)
ن»¥وں¥çœ‹ه®ƒوک¯هگ¦ه®é™…è؟”ه›ن؛†وںگن؛›ه†…ه®¹م€‚ - Tim Lewisdd($isModerator)
而不是dd($moderators)
。 - Tim LewisHasMany
集合http://pastebin.com/85NHE4hb - 然而,如果我重新添加exists()
,它将返回true或false。而且这是在PostsController
而不是CommentController
中。 - Halnex