Правило проверки Laravel UpdateUserRequest с идентификатором пользователя

У меня есть модель User, и это мой метод update() в UserController:

public function update(Request $request, User $user)
{
    // Assign authorization
    Gate::authorize('update', $user);
    
    $request->validate([
        'username' => 'required|unique:users,username,' . $user->id,
        // other rules ...
    ]);
    
    // ...
}

Я хочу сохранить эти правила проверки в отдельном UpdateUserRequest запросе:

class UpdateUserRequest extends FormRequest
{
    public function authorize(): bool
    {
        return true; // Changed to 'true' to handle authorization logic in UserPolicy
    }

    public function rules(): array
    {
        return [
            'username' => 'required|unique:users,username,' . $user->id, // <-- Problem
            // other rules ...
        ];
    }
}

Проблема здесь в том, что $user не определен. Я читал в другом месте, что использование маршрута для этого вопроса является возможным решением, но это не правильный способ решения этой задачи.

Мой вопрос: как правильно передать информацию о пользователе в класс UpdateUserRequest?

🤔 А знаете ли вы, что...
PHP поддерживает работу с различными протоколами, такими как HTTP, FTP и многое другое.


53
1

Ответ:

Решено

Мой вопрос в том, как правильно передать информацию о пользователе в Класс UpdateUserRequest?

Я предположил, что вы используете laravel 11.X, и ваше определение маршрута...

Route::put('/users/{user}', [UserController::class, 'update']);

В этом сценарии вы можете сделать это внутри UpdateUserRequest.

class UpdateUserRequest extends FormRequest
{
    public function authorize(): bool
    {
        // Here you can also interact with your `gates` & `policy`,Check the docs link I provided below to get clear insights.
        return true; 
    }

    public function rules(): array
    {
        //Scenario 1
        $user = User::find($this->route('user')); //If you are not using `implicit model binding`
        //Scenario 2
        $user = $this->user ; //If you are using `route-model-binding`


        return [
            'username' => 'required|unique:users,username,' . $user->id, // <-- "Issue will be solved"
            // other rules ...
        ];
    }
}

Затем в классе контроллера import и type-hint класс FormRequest, т. е. UpdateUserRequest в вашем методе контроллера, который отсутствует в вашем текущем коде.

public function update(UpdateUserRequest $request, User $user)
{
    // Assign authorization
    Gate::authorize('update', $user);

    // Retrieve the validated input data...
     $validated = $request->validated();  // it will by default validate all the input data you set up in the `rule()` of `UpdateUserRequest`
    
    
    // ...
}

Для получения более четкой и глубокой информации ознакомьтесь с официальной документацией здесь.


Интересные вопросы для изучения

Проблема с созданием билетов на мероприятиеWooCommerce: получить дату отмены заказаПочему мой запрос Laravel Eloquent возвращает записи с неправильными датами после применения соединения с дополнительными фильтрами, несмотря на начальные ограничения по дате?Создание вложенного массива с помощью foreachLaravel 11: ограничение скорости выполнения заданий, которое не должно превышать ограничение скорости внешнего APILaravel PlainTextToken имеет значение NULL при перечислении токеновПочему мой запрос Laravel Eloquent возвращает записи с неправильными датами после применения соединения с дополнительными фильтрами, несмотря на начальные ограничения по дате?Laravel 11: ограничение скорости выполнения заданий, которое не должно превышать ограничение скорости внешнего APIКак изменить базу запросов Laravel Filament Eloquent Query по условию?Импортируйте jQuery на одну страницу с помощью Vite