You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 21:12:49