PHP及Laravel如何将session中的错误数据传递到$errors参数
Laravel传递session错误到$errors变量的完整流程
整个过程由Laravel框架的内置逻辑自动完成,不需要手动处理,核心分为3个环节:
验证失败时的错误闪存
当自定义的FormRequest类校验失败时,Laravel会自动生成重定向回上一页面的响应,同时调用withErrors()方法把所有验证错误信息闪存到session的errors键下。闪存数据的生命周期只有下一次请求,页面加载完成后就会自动销毁。中间件完成视图变量共享
Laravel默认的web路由组会自动注册\Illuminate\View\Middleware\ShareErrorsFromSession中间件,这个中间件的核心作用就是把session里的错误数据同步到视图:- 每次请求进入、视图渲染前,中间件会先检查session中是否存在
errors闪存数据 - 存在就把数据实例化为
Illuminate\Support\MessageBag对象,不存在就生成一个空的MessageBag对象(避免模板调用$errors时出现变量未定义错误) - 最后调用
view()->share('errors', $messageBag)方法,把这个对象全局共享给所有当前请求要渲染的视图
- 每次请求进入、视图渲染前,中间件会先检查session中是否存在
你可以直接看这个中间件的核心源码,逻辑非常清晰:
public function handle($request, Closure $next) { view()->share('errors', $request->session()->get('errors', new MessageBag)); return $next($request); }
- 模板直接调用
Blade模板渲染时可以直接读取全局共享的$errors变量,不需要在每个控制器方法里单独传参,所以@foreach ($errors->all() as $error)代码可以直接运行。
注意:如果用的是api路由组,默认不会注册这个中间件,所以api路由对应的视图里不会自动生成$errors变量,需要手动处理。
内容的提问来源于stack exchange,提问作者wlv9320
相关产品推荐
相关产品推荐

