сеанс Symfony не сохраняется - PullRequest
0 голосов
/ 25 апреля 2018

Я сейчас работаю над сайтом с большим количеством таблиц. Почти все таблицы имеют фильтры, и, поскольку пользователь не хочет терять все свои фильтры при перезагрузке, я сохраняю фильтр в сеансе.

Пока все это работает, я запускаю ajax-вызов каждый раз, когда фильтр изменяется, чтобы сохранить новый фильтр в сеансе. Моя проблема, когда я пытаюсь очистить фильтры.

Когда пользователь нажимает кнопку очистки или закрывает последнее окно фильтра, ключ сеанса очищается, и он печатает ноль, но когда я перезагружаю страницу, последние фильтры загружаются, и сеанс печатает их, как будто я никогда не удалял их.

Функция, которую я использую для заполнения / опустошения сессии:

public function addPersistenceAction(Request $request)
{
    $parameters = $request->request->all();
    $session = $this->get('session');
    $session->start();//I tried removing/adding this line but it didn't change anything

    //if the key wasn't send, nothing happends
    if (!isset($parameters['storage'])){
        return new JsonResponse(0);
    }

    //if no data was send, it removes the key. 
    if(!isset($parameters['data'])) {
        $session->remove($parameters['storage']);
        // I also tried setting an empty array but it didn't work either
        //$session->set($parameters['storage'], []);
        return new JsonResponse($session->all()); // this prints the correct data
    }

    //if the data was sent, it is set. This works perfectly
    $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();

    //I checked and the session key I use is not touched in this function
    $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, {
    // something like "project_page_filter", the key for the session.
    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();
});
...