首页 > 解决方案 > Laravel ErrorBag 总是空的

问题描述

我正在使用 LaravelFormRequest验证表单,但ErrorBag始终为空。我发现这是一个常见问题,因为 Laravel 默认将所有路由都放在 Web 中间件中(是的,我读到:ErrorBag 在 Laravel 5.2 中始终为空)。事情是我没有在我的routes/web.php文件中指定这个中间件组,这应该是问题所在。

但我正在使用命名空间,我认为这可能是问题的根源。

路线:

Route::group(['namespace' => 'Pages'], function () {
    Route::post('/administration/add-member', 'AdminController@addMember');
});

表单请求:

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Facades\Auth;

class AddMemberRequest extends FormRequest
{
    public function authorize()
    {
        return (Auth::check() && Auth::user()->hasAllRights());
    }

    public function rules()
    {
        return [
            'firstname' => 'required|alpha|max:255',
            'lastname'  => 'required|alpha|max:255',
            'email'     => 'required|email|unique:users|max:255',
        ];
    }
}

我的控制器目前没有做任何令人难以置信的事情:

class AdminController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');

        if (Auth::check() && !Auth::user()->hasAllRights())
            throw new NotFoundHttpException();
    }

    public function addMember(AddMemberRequest $request)
    {
        var_dump($request->all());
    }

数据来自这个表格(我简化了):

<form id="add-member" class="mt-3" method="post" action="{{ url('/administration/add-member') }}">
@csrf

<input type="text" name="firstname">
<input type="text" name="lastname">
<input type="text" name="email">
<select name="season">
    <option value="" selected>None</option>
    ect...
</select>

<button id="btn-validate" type="submit" class="btn btn-success"><i class="fas fa-check mr-1"></i>Add member</button>

也许我的配置文件中有什么事情要做?

标签: phplaravelerror-handling

解决方案


将此中间件添加到您的路由

\Illuminate\View\Middleware\ShareErrorsFromSession::class,

在您的 HTTP 内核中

protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        // This middleware should apply to all web routes
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],

    'api' => [
        'throttle:60,1',
        'bindings',
    ],
];

并确保它以正确的顺序运行

protected $middlewarePriority = [
    // Start the session first
    \Illuminate\Session\Middleware\StartSession::class,
    // Then share errors from it
    \Illuminate\View\Middleware\ShareErrorsFromSession::class,
    \App\Http\Middleware\Authenticate::class,
    \Illuminate\Routing\Middleware\ThrottleRequests::class,
    \Illuminate\Session\Middleware\AuthenticateSession::class,
    \Illuminate\Routing\Middleware\SubstituteBindings::class,
    \Illuminate\Auth\Middleware\Authorize::class,
];

推荐阅读