Проблемы с политикой создания в Laravel 5

Я реализую роли и разрешения для проекта и использую политики, но у меня возникает проблема, когда я хочу разрешить или запретить создание новых записей в таблице пациентов, очень простые вещи. У меня есть это в моем PatientPolicy

// Only the users with root or admin roles can create patients;
public function create(User $user){
    return ($user->hasRole('root') || $user->hasRole('admin'));
}

// only the patient creator can edit the patient and see the edit button
public function update(User $user, Patient $patient){
    return $user->id == $patient->user_id;
}

AuthServiceProvider

protected $policies = [
    'App\Model' => 'App\Policies\ModelPolicy',
    'App\Patient' => 'App\Policies\PatientPolicy'
];

Контроллер пациента

public function edit(Patient $patient){
    if(Gate::denies('update', $patient)){
        abort(403, 'No esta autorizado de estar aqui');
    }
    return view('patients.edit', compact('patient'));
}

public function create(){
    if(Gate::denies('create')){
        abort(403, 'Usted no esta autorizado para crear pacientes');
    }
    return view('patients.create');
}

и в моих взглядах

@can('create')
    <li class="header">PROCESOS</li>
    <li><a href="/paciente/create"><i class="fa fa-book"></i> <span>Apertura de Historia Clínica</span></a></li>
@endcan

Проблема в том, что политика создания всегда возвращает false даже для тех пользователей, которым должно быть разрешено выполнять действие, однако политика редактирования работает отлично. Я что-то упускаю?


person cody    schedule 03.05.2016    source источник
comment
Возможный дубликат Как определить метод политики без аргументов в Laravel 5.2?   -  person Dov Benyomin Sohacheski    schedule 05.09.2016


Ответы (1)


Проблема в том, что методы Gate::denies и @can не знают, какую модель и класс политики им следует искать, когда нет аргумента для соответствия, поэтому вместо этого используйте этот код:

public function create(){
    if(Gate::denies('create', Patient::class)) {
        abort(403, 'Usted no esta autorizado para crear pacientes');
    }
    return view('patients.create');
}

и в ваших взглядах:

@can('create', App\Patient::class)
    <li class="header">PROCESOS</li>
    <li><a href="/paciente/create"><i class="fa fa-book"></i> <span>Apertura de Historia Clínica</span></a></li>
@endcan

Вы можете проверить мой полный ответ здесь: https://stackoverflow.com/a/37261276/3477084

person Hafez Divandari    schedule 27.05.2016