Я использую разрешение 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); }