Как использовать политику для индекса, который не использует модель, к которой принадлежит политика? - PullRequest
1 голос
/ 07 марта 2020

То, что я пытаюсь сделать, - это применить политику к методу управления, который перечисляет кучу записей вместо одной записи, как большинство примеров, которые я видел.

Вместо проверки на ThoughtRecords Я хочу проверить зарегистрированного пользователя hashedId для пользователя, который запрашивается hashedId в методе контроллера index().

Очевидно, в Laravel документах класс модели должен быть передан для действий, которые не требуют модели. Поэтому я запутался, как заставить это работать.

AuthServiceProvider. php

protected $policies = [
    'App\ThoughtRecord' => 'App\Policies\ThoughtRecordPolicy',
];

public function boot()
{
    $this->registerPolicies();
}

ThoughtRecordPolicy. php

public function view(User $signedInUser, User $client)
{
    //return true;
    dd('Policy working');
    //return $signedInUser->id === $client->id;
}

ThoughtRecordController. php

public function index($userHashedId)
{
    $client = User::where('hashed_id', $userHashedId)->first();

    $this->authorize('view', ThoughtRecord::class, $client);

    $records = ThoughtRecord::where('user_id', $client->id)->latest()->paginate(1);

    return ThoughtRecordResource::collection($records);
}

Ошибка

Слишком мало аргументов для функции App \ Policies \ ThoughtRecordPolicy :: view ()

Я также пробовал:

$this->authorize('view', $client);

Это действие не авторизовано.

1 Ответ

1 голос
/ 07 марта 2020

Как сказано:

Очевидно, что в документах Laravel класс модели должен передаваться для действий, которые не требуют модели. Поэтому я запутался, как заставить это работать.

Вам нужно передать и ThoughtRecord::class, и $client в массив:

$this->authorize('view', [ThoughtRecord::class, $client]);

...