У меня есть модель 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 и многое другое.
Мой вопрос в том, как правильно передать информацию о пользователе в Класс 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`
// ...
}
Для получения более четкой и глубокой информации ознакомьтесь с официальной документацией здесь.