【问题标题】:Laravel redirect with input and with errors not workingLaravel 重定向输入和错误不起作用
【发布时间】:2020-04-16 04:36:21
【问题描述】:

我在让 ->withInput() 和 ->withErrors() 工作时遇到问题,以便在验证失败时我可以在刀片中检索它们。

这是我在控制器中的内容:

$rules = array(
   'mobile' => 'required'
);

$validator = Validator::make($request->all(), $rules);

if ($validator->fails()) {
    $fieldsWithErrorMessagesArray = $validator->messages();
    $fieldsWithErrorMessagesArray = $fieldsWithErrorMessagesArray->messages();

    $formattedErrorArray = array();
    foreach ($fieldsWithErrorMessagesArray as $key => $error) {
       $formattedErrorArray[$key] = $error[0];
    }

    return redirect()->back()->withInput()->withErrors($formattedErrorArray);
}

但是在刀片中当 var_dump $errors 时,我得到了这个:

object(Illuminate\Support\ViewErrorBag)#267 (1) { ["bags":protected]=> array(0) { } }

如果我要 dd($fieldsWithErrorMessagesArray),它会给我:

array:7 [▼
  "mobile" => array:1 [▼
       0 => "The mobile field is required."
  ]
]

我也试过这种方式:

$test = array(
            'mobile' => 'No jobs found. Please try searching with different criteria'
        );

return redirect()->back()->withInput()->withErrors($test);

这行得通,我不确定为什么另一个行不通。有了这个测试数组,刀片文件看起来像这样:

object(Illuminate\Support\ViewErrorBag)#264 (1) { ["bags":protected]=> array(1) { ["default"]=> object(Illuminate\Support\MessageBag)#265 (2) { ["messages":protected]=> array(2) { ["mobile"]=> array(1) { [0]=> string(59) "No jobs found. Please try searching with different criteria" }} ["format":protected]=> string(8) ":message" } } }

这是我的刀片文件的样子:

@if ($errors->has('mobile'))
                                        @foreach($errors->get('mobile') as $error)
                                            <span class="validation_error">{{$error}}</span>
                                        @endforeach
                                    @endif
                                    <div class="form-group">
                                        <div class="input-group mb-2">
                                            <div class="input-group-prepend">
                                                <div class="input-group-text"><i
                                                            class="fas fa-mobile-alt text-info"></i>
                                                </div>
                                            </div>
                                            <input type="number" class="form-control" value="{{old('mobile')}}" name="mobile"
                                                   placeholder="Mobile Number">
                                        </div>
                                    </div>

我也有 var_dump 来查看带回的任何错误:

<?php
   echo var_dump($errors) . "</br>";
?>

下面我提供了 Kernel.php 文件的外观:

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

protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],

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



protected $routeMiddleware = [
    'auth' => \App\Http\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
    'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
    'can' => \Illuminate\Auth\Middleware\Authorize::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
];




protected $middlewarePriority = [
    \Illuminate\Session\Middleware\StartSession::class,
    \Illuminate\View\Middleware\ShareErrorsFromSession::class,
    \App\Http\Middleware\Authenticate::class,
    \Illuminate\Session\Middleware\AuthenticateSession::class,
    \Illuminate\Routing\Middleware\SubstituteBindings::class,
    \Illuminate\Auth\Middleware\Authorize::class,
];

【问题讨论】:

  • 你有没有试过 return back()->withInput()->withErrors($test);而不是 return redirect()->back()->withInput()->withErrors($test);?
  • 是的,我确实尝试过这个。此问题已修复。我在 .env 文件中将 cookie 设置为 SESSION_DRIVER 的值,该文件现在已更改为文件。重新启动服务器后,它可以使用 $validator->validate();

标签: php laravel validation laravel-5 laravel-blade


【解决方案1】:

你为什么不直接使用“自动重定向”:

$validator = Validator::make($request->all(), array(
   'mobile' => 'required'
));

$validator->validate(); // automatically redirects if validation fails

您可以在现有验证器实例上调用validate 方法。如果验证失败,将自动重定向用户。

这是完整的文档:https://laravel.com/docs/master/validation#automatic-redirection

注意 1:确保 Illuminate\View\Middleware\ShareErrorsFromSession 中间件列在 \app\Http\Kernel.php 文件 (full docs) 上的 web 中间件组中。

注意 2:Laravel 将检查会话数据中的错误,因此请检查要设置的 .env 文件上的 \config\session.phpSESSION_DRIVER 属性上的会话驱动程序。尝试不同的驱动程序并检查它是否有效。

【讨论】:

  • 我尝试过使用它,但是它不起作用,这就是为什么我必须以这种方式尝试。当我按照您建议的方式进行时,在刀片中我什么也得不到。如果我要 var_dump($errors),我会得到这个。 object(Illuminate\Support\ViewErrorBag)#267 (1) { ["bags":protected]=> array(0) { } }
  • 我忘了添加,当我使用这个时,我无法得到任何错误以及任何旧输入值
  • @dark_illusion_909099 你能发布你的刀片吗?你可能没有验证错误,我的意思是如果没有验证错误,$errors 将为空!
  • 我已更新我的帖子以包含刀片文件的外观
  • 我收到了一个验证错误,因为我没有填写该字段,而且在控制器中验证之后我有一个骰子说验证通过了
猜你喜欢
  • 1970-01-01
  • 2022-10-24
  • 1970-01-01
  • 2018-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多