【问题标题】:Laravel 5.2: withErrors on redirect not workingLaravel 5.2:重定向上的 withErrors 不起作用
【发布时间】:2016-06-30 23:57:04
【问题描述】:

我目前正在努力解决我自己无法解决的 Laravel 问题。如果我使用 withErrors() 传递错误,则错误不会传递到错误包 ($errors)。

我的控制器(FormController):

public function contact(Request $request) {

        $validator = Validator::make($request->all(), [
            'name' => 'required',
            'email' => 'required|email',
            'message' => 'required',
        ]);

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

        return redirect()->back();
    }

问题是,withInput() 也不起作用。问题可能来自哪里?感谢您的帮助!

(部分)定义的routes.php:

Route::group(['middleware' => 'web'], function(){
    Route::post('/contact', 'FormController@contact');
});

会话配置

return [
    'driver' => env('SESSION_DRIVER', 'memcached'),
    'lifetime' => 120,
    'expire_on_close' => false,
    'encrypt' => false,
    'files' => storage_path('framework/sessions'),
    'connection' => null,
    'table' => 'sessions',
    'lottery' => [2, 100],
    'cookie' => 'session',
    'path' => '/',
    'domain' => null,
    'secure' => false,

];

【问题讨论】:

  • 会话对你有用吗?
  • 尝试重定向路由或 url 而不是返回
  • @matiit 会话正在处理站点的其余部分。当我使用调试栏检查 POST to contact() 时,会话中出现正确错误的“错误”。
  • @ImtiazPabel 我试过了,但不幸的是这个问题没有任何改变..
  • 试试... ->withErrors($validator->errors())-> ...

标签: laravel laravel-5.2


【解决方案1】:

在 Laravel 5.2 中,您需要在路由中使用 web 中间件将错误传递给视图。

Route::group(['middleware' => ['web']], function () {
    Route::get('/', function() {
        return view('welcome');
    });
});

【讨论】:

  • 感谢您的帮助,不幸的是我已经使用了'web'中间件组......我听说中间件组之间交换会话时出现问题,但我只使用'web'中间件组。跨度>
【解决方案2】:

不要向 withInput 传递任何东西

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

并使用旧函数获取闪存数据

$name = $request->old('name');

{{old('name')}}

希望对你有帮助

【讨论】:

  • 我试过了,但没有任何运气......我认为这是一个会话问题,但会话按预期工作。
【解决方案3】:

如果您要重定向到的控制器也使用withErrors() 函数,则redirect()->back()->withErrors($validator) 中的错误消息将被覆盖。

但是,旧消息仍在会话中。所以你仍然可以使用session('errors') 阅读和显示它们:

@if ($errors->any())
    <div class="alert alert-danger">
        <ul class="my-0">
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@elseif (null !== session('errors') && session('errors')->any())
    <div class="alert alert-danger">
        <ul class="my-0">
            @foreach (session('errors')->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif

【讨论】:

    【解决方案4】:

    这可能是由于会话问题。要诊断此问题,请使用 print_r($request->session())。如果您在会话对象中获得不同的 id,则意味着会话设置不正确。

    要完成它,请打开 Kernel.php

    1. 不要在 $middleware 数组中指定下面的行

    2. 在 web 中间件组和 $middlewarePriority 数组中指定以下行

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

    【讨论】:

      猜你喜欢
      • 2018-04-08
      • 1970-01-01
      • 2014-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-03
      • 2017-07-11
      • 2017-05-22
      相关资源
      最近更新 更多