Laravel视图中不刷新页面更新Session值问题
问题根源与解决方案
核心问题
你遇到的问题本质是Blade模板代码的渲染时机问题:
- 视图中的
@if(session()->has('tipo_centroCalendario'))这类Blade语法,是在首次加载页面时由服务器解析并生成静态HTML的,之后发送到浏览器就变成了固定的JS代码,AJAX请求后不会重新执行Blade解析,所以前端永远拿的是第一次页面加载时的Session状态,根本感知不到服务器端Session的更新。 - 控制器中的
Session::forget()其实已经生效了,但前端的判断逻辑是静态的,所以看起来像是没生效。
修复步骤
1. 控制器修改:返回Session状态给前端
在JSON响应中把当前需要的Session值一起返回,让前端可以直接拿到最新状态:
/** RECARGAR CENTROS EN EL SELECTOR */ public function recargarTipoCentro(Request $request){ $up_servicios_id = $request['up_servicio_id']; // 执行Session操作 Session::put('up_servicioCalendario', $up_servicios_id); Session::forget('tipo_centroCalendario'); Session::forget('centroCalendario'); Session::forget('ubicacionCalendario'); // 获取最新的Session值,准备返回给前端 $tipoCentroSession = Session::get('tipo_centroCalendario'); // 修正查询逻辑:where改为whereIn,因为$up_servicios是数组 $up_servicios = DB::table('gen_a_up_servei') ->where('UP_ID_UP', $up_servicios_id) ->distinct()->pluck('UP_CODI_LDAP')->toArray(); $centros = DB::table('gen_a_centres') ->select('tipus') ->whereIn('CODIGO_EXT', $up_servicios) ->whereNull('DATA_BAIXA') ->distinct()->pluck('tipus')->toArray(); $tipo_centro = DB::table('gen_a_centres_tipus') ->orderBy('descripcio') ->select('id', 'descripcio') ->whereIn('id', $centros) ->get()->toArray(); // 把Session状态加入响应 return response()->json([ 'result' => true, 'response' => [ 'tipo_centro' => $tipo_centro, 'tipo_centroCalendario' => $tipoCentroSession ] ]); }
2. 前端AJAX修改:用响应数据控制视图
去掉Blade语法,完全通过AJAX返回的数据来处理选中状态,同时补上CSRF令牌(Laravel默认拦截无令牌的POST请求):
$.ajax({ type: "POST", url: '/recargarTipoCentro', data: { entidad_id: $('#entidad').val(), region_sanitaria_id: $('#region_sanitaria').val(), territorio_id: $('#territorio').val(), sap_id: $('#sap').val(), up_servicio_id: $('#up_servicio').val(), _token: '{{ csrf_token() }}' // 必须添加CSRF令牌 }, success: function(data) { if (!data.result) { alert('Hi ha hagut un error'); return false; } // 先清空下拉框,避免重复添加选项 $('#tipo_centro').empty(); // 添加默认的"todos"选项 $('#tipo_centro').append('<option value="todos">Todos</option>'); // 循环添加获取到的选项 $.each(data.response.tipo_centro, function(i, e) { $('#tipo_centro').append('<option value="' + e.id + '">' + e.descripcio + '</option>'); }); // 根据返回的最新Session值设置选中状态 if (data.response.tipo_centroCalendario && data.response.tipo_centroCalendario !== '') { $('#tipo_centro').val(data.response.tipo_centroCalendario); $('#tipo_centro').change(); } else { $('#tipo_centro').val('todos'); } } });
额外注意点
- 确保你的路由是在
web中间件组下,因为Session功能依赖web中间件提供的Session支持。 - 原代码中
where('CODIGO_EXT', $up_servicios)是错误的,因为$up_servicios是数组,必须用whereIn才能正确匹配数组中的多个值,否则查询会返回空结果。
内容的提问来源于stack exchange,提问作者obernal
相关产品推荐
相关产品推荐

