Laravel 请求验证不显示错误消息

Laravel request validation doesn't show error messages

使用组中间件后,无法访问错误消息。错误包 returns 为空。

之前没有问题

我研究过,有用户通过修改http/kernel.php

解决了问题

\Illuminate\Session\Middleware\StartSession::class, $middlewareGroups$middleware

但是,它对我不起作用。

另外 $validated = $request->validated(); 函数没有 returns 验证错误。在我的 CreditcardRequest Class 中,我有属性、消息、规则函数。如果验证失败,则需要显示这些消息。 以前验证时();方法是 运行 在控制器上,如果表单为空,它会显示消息。在中间件分组之前,我有 20 个页面都在工作。

信用卡Blade

<div class="messages">
    @if ($errors->any())
        <div class="row  mt-3">
            <div class="col-md-12">
                <div class="alert alert-warning alert-dismissable" role="alert">
                    <button type="button" class="close" data-dismiss="alert" aria-label="Close">
                        <span aria-hidden="true">&times;</span>
                    </button>
                    <h3 class="alert-heading font-size-h4 font-w400">Error!</h3>
                    @foreach ($errors->all() as $error)
                        <p class="mb-0">{{ $error }}</p>
                    @endforeach
                </div>
            </div>
        </div>
    @endif
</div>

信用卡请求

public function attributes()
{
    return [
        'cc_name' => 'CC Owner',
        ..
    ];
}

public function messages()
{
    return [
        'required' => 'Required: :attribute',
        ...
    ];
}

public function rules()
{
    return [
        'cc_name' => 'required|max:128',
    ];
}

控制器

public function doPaySection(CreditcardRequest $request)
  {

      $validated = $request->validated();
      $cc = TRUE;
      if ($cc):
          return redirect('/pay_success')->with('success', 'success');
      else:
          return redirect('/pay_error')->with('error', 'error');
      endif;
  }

web.php

Route::group(['middleware' => ['client.role:guest']], function () {
    Route::get('/login', 'HomepageController@showLogin')->name('login');
    Route::post('/login', 'HomepageController@doLogin');
    Route::post('/register', 'HomepageController@doRegister');
    Route::get('/register', 'HomepageController@showRegister')->name('register');
});

login.blade

@if ($errors->any())
    <div class="row  mt-3">
        <div class="col-md-12">
            <div class="alert alert-warning alert-dismissable" role="alert">
                <button type="button" class="close" data-dismiss="alert" aria-label="Close">
                    <span aria-hidden="true">&times;</span>
                </button>
                <h3 class="alert-heading font-size-h4 font-w400">Hata!</h3>
                @foreach ($errors->all() as $error)
                    <p class="mb-0">{{ $error }}</p>
                @endforeach
            </div>
        </div>
    </div>
@endif

控制器

public function doLogin(Request $request)
{
    if (auth()->guard('client')->attempt(['email' => request('email'), 'password' => request('password')])) {
        return redirect()->intended('/');
    } else {
        return redirect()->back()->with('error', 'error');
    }
}

你可以从下面session('error')

进去
return redirect()->back()->with('errors', 'error');

所以你的代码会像

@if (session('errors'))
    <div class="row  mt-3">
        <div class="col-md-12">
            <div class="alert alert-warning alert-dismissable" role="alert">
                <button type="button" class="close" data-dismiss="alert" aria-label="Close">
                    <span aria-hidden="true">&times;</span>
                </button>
                <h3 class="alert-heading font-size-h4 font-w400">Hata!</h3>
                @foreach (session('errors') as $error)
                    <p class="mb-0">{{ $error }}</p>
                @endforeach
            </div>
        </div>
    </div>
@endif

您现在拥有的代码不会向 $errors MessageBag 添加消息,它只会向名为错误的会话添加一个值。

如果你想在消息包中添加错误,你可以简单地抛出一个 ValidationException 重定向 back 与该消息:

public function doLogin(Request $request)
{
    if (auth()->guard('client')->attempt($request->only('email', 'password'))) {
        return redirect()->intended('/');
    }

    throw ValidationException::withMessages([
        'error' => 'The error message',
    ]);
}

不要忘记将 ValidationException 导入为:

use Illuminate\Validation\ValidationException;

你能试试在你的请求中使用这个 header 吗?特别是如果你是从邮递员那里打来的。

Accept:application/json

在使用这个之前,我会在无效请求的情况下获取 csrf 令牌。