В laravel 10 При вводе в форму срабатывает валидатор, но не выводит текст ошибки
К сожалению не имею пока валидации в других частях кода для сравнения и поиска ошибки.
Контроллер:
public function createNewUser(Request $request): Response|RedirectResponse
{
$request->validate($this->getValidationRules());
$photo = $this->handleProfilePhoto($request);
$data = $this->prepareUserData($request, $photo);
$user = new User();
$user->create($data);
$user->sendEmailVerificationNotification();
return redirect()->route('home')->with('success','Registering was successful. Now you can log in!');
}
Я ожидаю увидеть текст ошибки, но они просто не доходят до представления.
На этапе: $request->validate($this->getValidationRules()); происходит переадресация на прошлую форму, но ошибки не выводятся. Xdebug помог понять, что request уходит с описанием ошибки, отловленной валидатором.
Роутер:
Route::controller(UserController::class)->group(function() {
Route::post('/createNewUser', 'createNewUser')->name('createNewUser');
Route::post('/authenticate', 'authenticate')->name('authenticate');
Route::get('/dashboard', 'dashboard')->name('dashboard');
Route::get('/register', 'register')->name('register');
Route::get('/login', 'login')->name('login');
Route::post('/updateUser', 'updateUser')->name('updateUser');
Route::post('/logout', 'logout')->name('logout');
});
Middleware:
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
...
имеет запись ShareErrorsFromSession для удержания ошибок форм.Кеш чистил, попытка уловить $errors или $session('errors') с помощью dd() и var_dump() ни к чему не привела.
Представление подключено корректно.
Ответы (2 шт):
Могу предложить сделать так, создаете request:
php artisan make:request UserCreateRequest
namespace App\Http\Requests;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Contracts\Validation\Validator;
use Illuminate\Http\Exceptions\HttpResponseException;
class UserCreateRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, ValidationRule|array|string>
*/
public function rules(): array
{
return [
//правила валидации
];
}
//формирует ответ, если валидация провалена
//можете привести к тому, виду который вам нужен
protected function failedValidation(Validator $validator)
{
$errors = [];
foreach($validator->errors()->getMessages() as $field => $error){
$errors[$field] = $error[0];
}
throw new HttpResponseException(response()->json(['errors' => $errors]));
}
//можете задать кастомные тексты ошибок
public function messages(){
return [
'field1.required' => __('validation.required'),
'field2.required' => __('validation.another_error')
];
}
//или переименовать атрибуты
public function attributes()
{
return [
'field1' => 'Мыло, а не e-mail'
];
}
}
А и используете его в контроллере:
namespace App\Http\Controllers;
use App\Http\Requests\UserCreateRequest;
...
public function createNewUser(UserCreateRequest $request): Response|RedirectResponse
{
$photo = $this->handleProfilePhoto($request);
$data = $this->prepareUserData($request, $photo);
$user = new User();
$user->create($data);
$user->sendEmailVerificationNotification();
return redirect()->route('home')->with('success','Registering was successful. Now you can log in!');
}
Ошибки не отображаются, скорее всего потому-что вы их не обрабатываете.
Обратитесь к документации Laravel: https://laravel.com/docs/10.x/validation#quick-displaying-the-validation-errors