【问题标题】:Laravel ErrorBag always emptyLaravel ErrorBag 总是空的
【发布时间】:2019-09-05 17:02:55
【问题描述】:

我正在使用 Laravel FormRequest 验证表单,但 ErrorBag 始终为空。我发现这是一个常见问题,因为 Laravel 默认将所有路由都放在 Web 中间件中(是的,我读到了这个:ErrorBag is always empty in 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>

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

【问题讨论】:

  • 您可以运行php artisan route:list 并查看影响您遇到问题的路由的中间件。您可能没有为该路由启用会话中间件(会话用于将您的错误闪回到下一页)
  • 你使用的是什么版本的 Laravel? routes.php 是个很老的东西了
  • Caddy DZ 我正在使用最后一个版本。我没有routes.php 文件,我只是从帖子中不假思索地拿起了这个……我编辑了我的帖子来纠正这个问题。
  • deefour 我遇到问题的路线有 web 和 auth 中间件。它还应该有一个会话中间件吗?

标签: php laravel error-handling


【解决方案1】:

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

\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,
];

【讨论】:

  • 我是 Laravel 的初学者,所以我不确定我做对了。我只是将您的行放入内核的$middlewareGroups 数组中。这没有任何改变。
  • 我的文件和你的一样,只是我没有\Illuminate\Routing\Middleware\ThrottleRequests::class 中间件,所以我添加了它。 ErrorBag 仍然是空的。
  • 请附上你的FormRequest类,你的route,你发布的数据和你的控制器方法,玩猜谜游戏效率不高,我不是巫师
  • 我编辑了我的帖子。我希望你会得到你需要的任何东西。谢谢你帮助我。
猜你喜欢
  • 2016-07-22
  • 1970-01-01
  • 2020-06-20
  • 2021-09-08
  • 2023-01-15
  • 2020-02-27
  • 1970-01-01
  • 2017-05-24
  • 2021-08-16
相关资源
最近更新 更多