Laravel初始加载页面时Session错误消息不显示问题解决
初始加载页面时Session中错误消息不显示的解决方案
问题根源
你遇到的问题核心在于Session::flash()的特性:flash存储的数据仅在下一次HTTP请求中可用。当前请求中你存入Session的错误消息,在本次视图渲染时还未被加载——@error指令在初始请求时,优先读取的是当前请求周期内视图共享数据中的errors对象,而非Session里刚存入的flash数据。只有刷新页面(发起第二次请求)时,Session的flash数据才会被读取到,错误消息才会显示。
解决方案
要实现「当前请求返回视图时直接显示错误,同时错误存入Session」的需求,你需要在addErrorsToSession方法中,同时将错误袋注入当前请求的视图共享数据,而不只是存入Session。
修改后的addErrorsToSession方法如下:
/** * Add an error array to the MessageBag in the * ViewErrorBag of the session * * @param array|null $errors */ private static function addErrorsToSession($errors) { if (!is_null($errors)) { $sessionErrors = Session::get('errors', new ViewErrorBag); if (! $sessionErrors instanceof ViewErrorBag) { $sessionErrors = new ViewErrorBag; } $bag = $sessionErrors->getBags()['default'] ?? new MessageBag; foreach ($errors as $key => $value) { $bag->add($key, $value); } $sessionErrors->put('default', $bag); Session::flash('errors', $sessionErrors); // 关键:将错误袋注入当前请求的视图共享数据 app('view')->share('errors', $sessionErrors); } }
为什么这样有效?
app('view')->share('errors', $sessionErrors)会把处理后的ViewErrorBag直接共享给当前请求的所有视图,@error指令在渲染时能直接读取到这个错误袋,因此初始加载页面就能显示错误。- 同时
Session::flash('errors', $sessionErrors)保证了刷新页面(下一次请求)时,错误消息依然能从Session中读取并显示。
额外说明
如果你只是在当前请求返回视图的场景下使用,也可以简化逻辑:直接创建MessageBag并共享给视图,同时存入Session。但上面的修改兼容了「当前请求返回视图」和「重定向后显示错误」两种场景,更通用。
内容的提问来源于stack exchange,提问作者SenneVP
相关产品推荐
相关产品推荐

