Политики с дополнительными параметрами - PullRequest
0 голосов
/ 08 мая 2018

Я знаю, как использовать политики Laravel, и все работает, но я застрял с create(...) методом.

Мое приложение - дневник тренировок для лыжников. Каждый гонщик может управлять (просматривать, добавлять, редактировать ..) своим собственным дневником. Каждый тренер может вести свой дневник, дневник всех гонщиков, но не других тренеров. Я использую нативную политику Laravel, и она прекрасно работает при *update(...) и delete(...) методе, но не create(...).

TrainingRecordPolicy.php:

public function update(User $user, TrainingRecord $record)
{
    if ($user->id == $record->user->id) {
        return true;
    }
    if ($user->isTrainer() && $record->user->isRacer()) {
        return true;
    }
    return false;
}

Я использую его в контроллерах типа $this->authorize('update', $record). Но если я хочу проверить, может ли пользователь создать новую запись в дневнике других пользователей, я понятия не имею, как с этим справиться.

Это не работает $this->authorize('create', TrainingRecord::class, $diaryOwner), и если я использую $this->authorize('createDiaryRecord', $diaryOwner), он вызывает метод внутри UserPolicy.

Как отправить $diaryOwner в качестве дополнительного параметра методу create() в политике?

Примечание : $diaryOwner извлекается из параметра маршрута user в маршруте с подписью /diary/{user}

1 Ответ

0 голосов
/ 08 мая 2018

Вы можете получить доступ к $diaryOwner в рамках политики, используя request() помощник.

public function create(User $user) 
{
    $diaryOwner = request()->user; // because route is defined as /diary/{user}
}

Может быть проблема, потому что:

При использовании динамических свойств Laravel сначала будет искать значение параметра в полезной нагрузке запроса. Если его нет, Laravel будет искать поле в параметрах маршрута.

Таким образом, вместо использования request()->user используйте request()->route()->parameter('user').

Также, если вы используете \Illuminate\Routing\Middleware\SubstituteBindings::class, вы получите User экземпляр.

...