laravel - Laravel 验证有效,但返回 200 而不是 422
问题描述
我正在用 Laravel 5.8 和 vue 构建一个 SPA;用于 API 身份验证的 Laravel Passport。一切都很好,直到上周我注意到验证失败时我停止获得 422。我开始得到 200,但验证失败并返回通常的“{“status”:“failed”,“error”:“给定数据无效。”}”。即使用户在 Laravel RegisterController 注册并且验证失败,这也是我所得到的。在此之前,Laravel 会返回 302 并识别错误的字段。现在我得到的只是一个空白页,其中包含 {"status":"failed","error":"The given data was invalid."}。进入 API 本身,表单验证也是如此。失败时返回 200 而不是 422。所以<has-error :form="form" field="category"></has-error>
已停止在我的应用程序中显示错误。这太令人沮丧了。我检查了我的代码一百万次,一切看起来都很完美。请记住,在经过 4 个多月的正确操作后,这突然开始一周前。
注册控制器
<?php
namespace App\Http\Controllers\Auth;
use App\User;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Notifications\Notifiable;
use Notification;
use Auth;
use App\Mail\WelcomeMail;
use Mail;
use App\Notifications\newUser;
class RegisterController extends Controller
{
/*
|--------------------------------------------------------------------------
| Register Controller
|--------------------------------------------------------------------------
|
| This controller handles the registration of new users as well as their
| validation and creation. By default this controller uses a trait to
| provide this functionality without requiring any additional code.
|
*/
use RegistersUsers;
/**
* Where to redirect users after registration.
*
* @var string
*/
protected $redirectTo = '/dashboard';
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest');
}
/**
* Get a validator for an incoming registration request.
*
* @param array $data
* @return \Illuminate\Contracts\Validation\Validator
*/
protected function validator(array $data)
{
return Validator::make($data, [
'firstname' => ['required', 'string', 'max:255'],
'surname' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'mobile' => ['required', 'digits:11'],
'state' => ['required', 'string', 'max:50'],
'password' => ['required', 'string', 'min:8'],
]);
}
/**
* Create a new user instance after a valid registration.
*
* @param array $data
* @return \App\User
*/
protected function create(array $data)
{
$user = User::create([
'firstname' => $data['firstname'],
'surname' => $data['surname'],
'email' => $data['email'],
'mobile' => $data['mobile'],
'state' => $data['state'],
'role' => $data['role'],
'password' => Hash::make($data['password']),
'bonus' => 1000,
'company' => $data['company']
]);
$admin = User::where('role', 'admin')->get();
Notification::send($admin, new newUser($user));
Mail::to($data['email'])->send(new WelcomeMail($user));
return $user;
}
}
注册.blade.php
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="csrf-token" content="{{ csrf_token() }}">
<link rel='manifest' href='/manifest.webmanifest'>
<title>dafixas</title>
<!-- Fonts -->
<link href="https://fonts.googleapis.com/css?family=Nunito:200,600" rel="stylesheet">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
<link rel="stylesheet" href="/css/style.css">
</head>
<body>
<div class="container">
<div class="row justify-content-center">
<div class="col-md-12 text-center signupTitle">
<a href="/"><img src="img/Megalabourers_logo.jpg"><span> dafixas</span></a>
</div>
<div class="row">
</div>
<div class="col-md-8">
<div class="card card-margin">
<div class="card-body">
<p>You're Amazing! Let's Get to Know You.</p>
<form method="POST" action="{{ route('register') }}">
@csrf
<div class="form-group row">
<label for="firstname"></label>
<div class="col-md-6">
<input id="firstname" type="text" class="form-control @error('firstname') is-invalid @enderror" name="firstname" value="{{ old('firstname') }}" required autocomplete="firstname" autofocus placeholder="First Name">
@error('firstname')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
<label for="surname"></label>
<div class="col-md-6">
<input id="surname" type="text" class="form-control @error('surname') is-invalid @enderror" name="surname" value="{{ old('surname') }}" required autocomplete="surname" placeholder="Surname">
@error('surname')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="form-group row">
<label for="email"></label>
<div class="col-md-12">
<input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" required autocomplete="email" placeholder="E-Mail">
@error('email')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="form-group row">
<label for="mobile"></label>
<div class="col-md-12">
<input id="mobile" type="text" class="form-control @error('mobile') is-invalid @enderror" name="mobile" value="{{ old('mobile') }}" required autocomplete="mobile" placeholder="Mobile Number">
@error('mobile')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="form-group row">
<label for="company"></label>
<div class="col-md-12">
<input id="company" type="text" class="form-control @error('mobile') is-invalid @enderror" name="company" value="{{ old('company') }}" autocomplete="company" placeholder="Company Name">
@error('company')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="form-group row">
<label for="city"></label>
<div class="col-md-12">
<select class="form-control" id="state" name="state" class="form-control">
<option selected="true" disabled="disabled">Please select Your State of Residence</option>
<option value="Abia">Abia</option>
<option value="Adamawa">Adamawa</option>
<option value="Akwa Ibom">Akwa Ibom</option>
<option value="Anambra">Anambra</option>
<option value="Bauchi">Bauchi</option>
<option value="Bayelsa">Bayelsa</option>
<option value="Benue">Benue</option>
<option value="Borno">Borno</option>
<option value="Cross Rive">Cross River</option>
<option value="Delta">Delta</option>
<option value="Ebonyi">Ebonyi</option>
<option value="Edo">Edo</option>
<option value="Ekiti">Ekiti</option>
<option value="Enugu">Enugu</option>
<option value="FCT">Federal Capital Territory</option>
<option value="Gombe">Gombe</option>
<option value="Imo">Imo</option>
<option value="Jigawa">Jigawa</option>
<option value="Kaduna">Kaduna</option>
<option value="Kano">Kano</option>
<option value="Katsina">Katsina</option>
<option value="Kebbi">Kebbi</option>
<option value="Kogi">Kogi</option>
<option value="Kwara">Kwara</option>
<option value="Lagos">Lagos</option>
<option value="Nasarawa">Nasarawa</option>
<option value="Niger">Niger</option>
<option value="Ogun">Ogun</option>
<option value="Ondo">Ondo</option>
<option value="Osun">Osun</option>
<option value="Oyo">Oyo</option>
<option value="Plateau">Plateau</option>
<option value="Rivers">Rivers</option>
<option value="Sokoto">Sokoto</option>
<option value="Taraba">Taraba</option>
<option value="Yobe">Yobe</option>
<option value="Zamfara">Zamfara</option>
</select>
@error('state')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="form-group row">
<label for="password"></label>
<div class="col-md-12">
<input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" required autocomplete="new-password" placeholder="Create Password">
@error('password')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<input type="hidden" name="role" value="user">
<div class="form-group row mb-0">
<div class="col-md-12">
<button type="submit" class="btn btn-lg">
Create My Account
</button>
</div>
</div>
</form>
<div class="loginnow">
Already Have an Account? Please <a href="{{ route('login') }}">Log in</a>
</div>
<div class="loginnow">
<span>By clicking on Create My Account, you agree to our <a href="/terms">terms & conditions</a> and <a href="/privacy">privacy policy</a></span>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
非常感谢!
解决方案
所以这对我有用:
if ($exception instanceof ValidationException && $request->expectsJson()) {
return response()->json(['message' => 'The given data was invalid.', 'errors' => $exception->validator->getMessageBag()], 422);
}
在 app\Exceptions\Handler.php 中,渲染函数。但我仍然无法理解最初出了什么问题。
推荐阅读
- c++ - 为什么我的断言不会引发错误?
- c++ - 为什么 MSVC 和 GCC 在 vtable 中以不同方式放置覆盖的纯虚函数?
- unix - Bash Unix:Tee 和 PID
- python-3.x - django 模型在每次迁移时都会收到 Alter Field 警报
- flutter - Get.to(MyPage()) - 如何删除所有以前的路由 - Flutter GetX
- typescript - 减速器类功能中的打字稿类型问题
- android - 如何使用提供者值更新其他页面?
- mysql - 返回子查询中的最后一条记录 - MySQL
- flutter - 文本未显示我发送给它的变量
- tableau-api - 如何基于最小日期进行聚合,但仅在对所有日期应用维度过滤器之后?