【问题标题】:Laravel validation don't pass to bladeLaravel 验证不会传递给刀片
【发布时间】:2021-07-17 15:19:39
【问题描述】:

我将项目从存储库拉到本地环境。我遇到了验证消息不显示在刀片​​上的问题。

在我的控制器函数中,我可以像这样转储验证错误:

        $validator = Validator::make($request->all(), [
            'first_name' => 'required|min:3',
        ]);

        if ($validator->fails()) {
            dd($validator);
            return redirect()->back()->withErrors($validator)->withInput();
        }    

我花了一些时间搜索可能导致此问题的原因,并发现一些结果表明我的问题可能与网络中间件相关。

最初,我的文件如下所示:

路由服务提供者

    protected function mapWebRoutes()
    {
        Route::middleware('web')
            ->namespace($this->namespace)
            ->group(base_path('routes/web.php'));
    }

内核

    protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
        \App\Http\Middleware\TrustProxies::class,
    ];

    /**
     * The application's route middleware groups.
     *
     * @var array
     */
    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            // \Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],

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

web.php

Route::get('register', 'Auth\RegisterController@getRegister');
Route::post('register', 'AuthController@postRegister');

我尝试将我的路由包装在这样的网络中间件中:

Route::group(['middleware' => ['web']], function () {
Route::get('register', 'Auth\RegisterController@getRegister');
Route::post('register', 'AuthController@postRegister');
});

我还尝试将 StartSession::class 和 ShareErrorsFromSession::class 从 middlewareGroups 移动到中间件并从 mapWebRoutes 中删除中间件('web'),但问题仍然存在。也许有人遇到了同样的问题并且能够解决它?

我的 Laravel 版本是:5.7.29,php 版本是:7.1.33

生产验证工作

【问题讨论】:

  • 如何在刀片上显示错误?
  • 你忘了放最重要的部分.....视图
  • 我没有包含视图部分,因为它正在生产中,所以我认为它没有在刀片中显示的内容。

标签: php laravel validation


【解决方案1】:

您应该返回MessageBag,而不是返回 $validator 对象,您可以通过 $validator->errors() 获得它。

所以您的退货声明将如下所示:

return redirect()->back()->withErrors($validator->errors())->withInputs()

MessageBag 看起来像这样['attrXY' => [error1, error2, ...] ]。这些错误将自动显示在您的刀片视图中的 $errors 变量中。 (因为 withErrors() 方法) 您可以列出所有错误:

@if ($errors->any())
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif

或者您可以检查是否存在特定错误:$errors-&gt;has('attrXY') 并显示此属性的所有错误消息。

这些内容中的大部分,甚至更多有用的信息都可以在文档中找到。 https://laravel.com/docs/8.x/validation#quick-displaying-the-validation-errors

【讨论】:

  • 感谢您的评论,我的错误我没有解释清楚 - 验证在生产站点上工作,所以我认为刀片或控制器方法没有问题。但我也尝试了你的解决方案 - 仍然是同样的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-22
  • 1970-01-01
  • 1970-01-01
  • 2016-08-08
  • 1970-01-01
  • 2019-08-01
相关资源
最近更新 更多