Политика Laravel (слишком мало аргументов для функции App \ Policy)

Я пытаюсь настроить свою политику для пользователей. Однако я продолжаю получать сообщение об ошибке:

Too few arguments to function App\Policies\UserPolicy::update(), 1 passed in /vendor/laravel/framework/src/Illuminate/Auth/Access/Gate.php on line 481 and exactly 2 expected (View: /resources/views/users/index.blade.php)

ErrorException /app/Policies/UserPolicy.php 20

which is on the UserPolicy@update function

Когда я вхожу в систему как super_admin, он работает нормально, но выдает эту ошибку всякий раз, когда я вхожу в систему как пользователь с другой ролью.

Ниже моя текущая реализация:

UserPolicy

class UserPolicy
{
    use HandlesAuthorization;

    public function update(User $user, User $userEdit)  {
        if ($user->id == $userEdit->id) {
            return true;
        }
        return $user->can('update_user');
    }

    public function before($user, $ability) {
        if ($user->hasRole('super_admin')) {
            return true;
        }
    }
}

UsersController

class UsersController extends Controller {

    public function __construct() {
        $this->middleware('auth');
    }

    public function edit(User $user) {
        $this->authorize('update', $user);
        return view('users.edit', [
            'user' => User::with('roles', 'level')->find($user->id),
            'surveys' => \App\Survey::all(),
        ]);
    }

    public function update(UserRequest $request, User $user) {
        $this->authorize('update', $user);
        $request->save();
        session()->flash('success', 'User successfully updated');

        // means user is editing his own profile
        if (auth()->id() == $user->id) {
            return redirect('/dashboard');
        } else {
            return redirect('/users');
        }
    }
}

UserRequest

class UserRequest extends FormRequest {

    public function authorize() {
        return true;
    }

    public function rules() {
        switch ($this->method()) {
            case 'POST':
                return [
                    'name' => 'required|string',
                    'email' => 'required|string|email|max:255|unique:users',
                    'role'  => 'required|exists:roles,id',
                    'level' => 'required|string',
                ];
                break;

            case 'PATCH':
                return [
                    'name' => 'required|string|max:255',
                    'email' => 'required|string|email|max:255|unique:users,email,'.$this->user->id,
                    'role'  => 'sometimes|exists:roles,id',
                    'level' => 'sometimes|string',
                    'password' => 'nullable|sometimes|string|min:6|confirmed'
                ];
                break;

            default:
                break;
        }
    }

    public function save() {
        switch (request()->method()) {
            case 'POST':
                $this->createUser();
                break;

            case 'PATCH':
                $this->updateUser();
                break;

            default:
                break;
        }
    }

    protected function createUser() {
        // random generate password
        $password = str_random(8);

        $user = User::create([
            'name' => request('name'),
            'email' => request('email'),
            'level_id' => request('level'),
            'password' => Hash::make($password),
        ]);
        $user->assignRoleById(request('role'));

        Mail::to($user)->send(new WelcomeMail($user, $password));
    }

    protected function updateUser() {
        $user = User::findOrFail($this->user->id);
        $user->name = request('name');
        $user->email = request('email');

        if (request('password') != '') {
            $user->password = Hash::make(request('password'));
        }

        if (request('level') != '') {
            $user->level_id = request('level');
        }

        $user->update();

        if (request('role') != '') {
            $user->roles()->sync([request('role')]);
        }
    }
}

AuthServiceProvider

class AuthServiceProvider extends ServiceProvider
{
    /**
     * The policy mappings for the application.
     *
     * @var array
     */
    protected $policies = [
        \App\User::class => \App\Policies\UserPolicy::class,
    ];

    /**
     * Register any authentication / authorization services.
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();
        foreach ($this->getPermissions() as $permission) {
            Gate::define($permission->name, function($user) use ($permission) {
                return $user->hasRole($permission->roles);
            });
        }
    }

    protected function getPermissions() {
        return Permission::with('roles')->get();
    }
}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
4
0
6 518
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В UserRequest вы не указали никаких параметров при вызове $user->update();. Для функции update() требуется экземпляр UserRequest, а также User.

Попробуйте: $user->update(request()->all(), $user)

Редактировать: Я бы просто переместил следующее ...

$this->authorize('update', $user);
$request->save();
session()->flash('success', 'User successfully updated');

// means user is editing his own profile
if (auth()->id() == $user->id) {
    return redirect('/dashboard');
} else {
    return redirect('/users');
}

... к функции updateUser().

Или вы должны вызвать $ user-> save () вместо update (), чтобы сохранить примененные изменения в db.

mutas 29.09.2018 11:13

Ошибка все равно осталась. Эта ошибка уже срабатывает при выполнении UserController @ index, это происходит не только при запуске I UserController @ update.

John 30.09.2018 09:37
Ответ принят как подходящий

В моем файле просмотров я звоню

@can('update', App\User::class)
    <!-- html code --!>
@endcan

вместо того

@can('update', $user)
    <!-- html code --!>
@endcan

Я не передавал пользовательский экземпляр функции, которая вызывала ошибку.

Другие вопросы по теме