Laravel 5: проверьте, принадлежит ли пользователю список модераторов, прежде чем разрешить ему редактировать

Я использую разрешение Gate чтобы проверить, есть ли у пользователя разрешения на доступ или что-то увидеть.

Например, у меня есть определение шлюза update-post которое проверяет, владеет ли пользователь этой почтой или владеет субпользователем, если да, то он сможет увидеть ссылку «Изменить» и получить доступ к маршруту «Редактировать». Если нет, он ничего не увидит.

Теперь я пытаюсь добавить другие разрешения, чтобы проверить, принадлежит ли пользователь к таблице «модераторы», если да, он также сможет увидеть ссылку «Изменить» на subreddit/show

Он отлично работает для первых двух проверок, но не работает на третьем, а ссылка «Изменить» всегда видна сейчас, хотя я не могу получить доступ к редактированию маршрутов сообщений, которые не являются моими или принадлежат к собственному субреддите.

EDIT: я редактировал $moderators_list теперь он проверяет, является ли зарегистрированный пользователь модератором subreddit, который он просматривает. dd($moderators_list получает список с правильными значениями, но я не могу использовать $moderators_list->user_id , который даст Undefined property: Illuminate\Database\Eloquent\Collection::$user_id

EDIT 2: я исправил запрос, который получает user_id пользователя, который является модератором в subreddit. Таким образом, теперь, используя $moderators_list->user-id я получаю идентификатор 3, который является идентификатором пользователя текущего входа. Но проверка ворот все еще не удалась, не удалось редактировать сообщения в subreddit, в котором я модератор.

Мои таблицы

 users: id, name, email... subreddits: id, user_id... posts: id, user_id, subreddit_id... moderators: id, user_id, subreddit_id... 

Это определения $gate

 $gate->define('update-post', function ($user, $post, $moderators_list) { // Check if user is subreddit owner if ($user->id === $post->subreddit->user->id) { return true; } // Check if user is the post author if ($user->id === $post->user_id) { return true; } // Check if user is a moderator of a subreddit if ($user->id === $moderators_list->user_id) { return true; } return false; }); 

И это метод show() на PostsController

Обратите внимание, что dd($moderators_list) выводит список всех модераторов subreddit, в которых находится этот пост, поэтому я получаю правильный результат.

 public function show(Post $post, Subreddit $subreddit, Moderator $moderator) { $post = Post::with('user.votes')->findOrFail($post->id); $moderator = Moderator::where('user_id', '=', Auth::id())->first(); $moderators_list = Moderator::where('subreddit_id', '=', $post->subreddit->id)->where('user_id', '=', Auth::id())->first(); return view('post/show')->with('post', $post) ->with('moderator', $moderator) ->with('moderators_list', $moderators_list); } 

И вот как я проверяю, есть ли у пользователя доступ, чтобы увидеть ссылку «Изменить» в представлении

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

Вы можете проверить, является ли пользователь модератором непосредственно в БД:

 $isModerator = $post->subreddit->moderators()->where('user_id', $user->id)->exists(); 
 $gate->define('update-post', function ($user, $post, $moderators_list) { // Check if user is subreddit owner if ($user->id === $post->subreddit->user->id) { return true; } // Check if user is the post author if ($user->id === $post->user_id) { return true; } // Check if user is a moderator of a subreddit if (in_array($user->id, $moderators_list)) { //will need to add ->toArray(); after the ->get() in the $moderators_list query. return true; } return false; }); 

Теперь вам нужно добавить -> toArray (); после -> get () в запросе $ moderators_list:

 public function show(Post $post, Subreddit $subreddit, Moderator $moderator) { $post = Post::with('user.votes')->findOrFail($post->id); $moderator = Moderator::where('user_id', '=', Auth::id())->first(); $moderators_list = Moderator::where('subreddit_id', '=', $post->subreddit->id)->get()->toArray; return view('post/show')->with('post', $post) ->with('moderator', $moderator) ->with('moderators_list', $moderators_list); }