symfony session not saving

9 浏览
0 Comments

symfony session not saving

我目前正在开发一个包含很多表格的网站。

几乎所有的表格都有过滤器,由于用户不希望在重新加载页面时丢失所有的过滤器,所以我将过滤器保存在会话中。

到目前为止,这一切都正常,每当过滤器发生变化时,我运行一个ajax调用来保存新的过滤器到会话中。

我的问题是当我尝试清除过滤器时。

当用户点击清除按钮或关闭最后一个过滤器框时,会话键被清空,打印出null,但是当我重新加载页面时,最后的过滤器被加载,并且会话将它们打印出来,就好像我从未移除它们一样。

我用于填充/清空会话的函数:

public function addPersistenceAction(Request $request)
{
    $parameters = $request->request->all();
    $session = $this->get('session');
    $session->start();//我尝试删除/添加这行代码,但没有改变任何东西
    //如果没有发送键,则不做任何操作
    if (!isset($parameters['storage'])){
        return new JsonResponse(0);
    }
    //如果没有发送数据,则删除键。
    if(!isset($parameters['data'])) {
        $session->remove($parameters['storage']);
        //我也尝试设置一个空数组,但也不起作用
        //$session->set($parameters['storage'], []);
        return new JsonResponse($session->all()); // 这打印出正确的数据
    }
    //如果发送了数据,就设置它。这完美地工作
    $session->set(
        $parameters['storage'],
        $parameters['data']
    );
    return new JsonResponse($session->get($parameters['storage']))
}

这个函数总是返回我期望的结果,但每次重新加载页面时,会话仍然保留着上一个过滤器。我尝试了不同的过滤器,它总是最后一个,所以它不可能在我的控制器中被硬编码。

有趣的是,我注意到如果我在重新加载页面之前手动运行获取过滤器数据的函数,它会显示正确的值,如果我在那之后重新加载,过滤器会正确地清空。

所以我的问题是:我的会话为什么似乎没有保存,并且是否有一种以编程方式“强制”Symfony保存会话数据的方法?

一些有用的代码:

获取会话数据的函数:

/**
 * @param Request $request
 * @return JsonResponse
 */
public function getSessionDataAction(Request $request){
    $parameters = $request->request->all();
    $session = $this->get('session');
    $session->start();
    if (!empty($parameters['storage'])) {
        $data = $session->get($parameters['storage'])?:[];
        return new JsonResponse($data);
    }else{
        return new JsonResponse(array('status' => 'failed', 'message' => 'storage is mandatory'));
    }
}

我的控制器函数:

/**
 * @param Request $request
 * @return Response
 */
public function indexAction(Request $request)
{
    $this->denyAccessUnlessGranted(RoleVoterHelper::SECTION_USER_VIEW);
    $session = $request->getSession();
    //我检查过,我在这个函数中使用的会话键没有被修改
    $filterWidgets = $this->get('dmt.filter.manager')->getWidgetData('user_filter');
    if (!$this->get('dmt.role_voter')->getExtGranted(RoleVoterHelper::SECTION_USER_VIEW)) {
        $filterWidgets['company'] = $this->getDoctrine()->getRepository('BugTrackerModelBundle:Company')->findByAuthorities($this->getUser()->getAuthorities());
    }
    $authorities = $this->getDoctrine()->getRepository('BugTrackerModelBundle:Authority')->findAll();
    return $this->render('DMTBundle:User:index.html.twig', [
        'filter_widgets' => $filterWidgets,
        'usersColumns'   => $session->get('usersColumns'),
        'usersSort'      => $session->get('usersSort'),
        'isSuperAdmin'   => $this->isGranted(UserHelper::ROLE_SUPER_ADMIN),
        'authorities'     => $authorities,
    ]);
}

页面打开时调用的javascript:

$.post(dependencies.bridgeGetUrl, {
    // 类似于"project_page_filter",会话的键。
    storage : dependencies.storage
}).success(function(response){
    dependencies.filterManager.hook(function(app){
        app.scheme = response;
        app.readScheme();
    });
    run(dependencies);
    if(typeof dependencies.callback == "function"){
        dependencies.callback(dependencies.params);
    }
});

发送任何修改到会话的javascript:

App.scheme始终是当前过滤器的值

dependencies.filterManager.setLifecycle(["add", "change-value"], function(app) {
    $.post(dependencies.bridgeUrl, {
        storage : dependencies.storage,
        data : app.scheme
    });
}).setLifecycle(["remove-all", "remove"], function(app) {
    $.post(dependencies.bridgeUrl, {
        storage : dependencies.storage,
        data : app.scheme
    });
    $("#filterSubmit").click();
});

0