Рейтинг:1

Могу ли я использовать службу сеанса напрямую, а не через запрос?

флаг co

Drupal документация по сессиям упоминает, что сеансы могут быть доступны через объект Request:

Доступ к данным сеанса осуществляется через \Symfony\Component\HttpFoundation\Request::getSession() метод, который возвращает экземпляр \Symfony\Component\HttpFoundation\Session\SessionInterface. Большинство важными методами SessionInterface являются set(), get() и remove().

Однако я также обнаружил, что существует служба сеанса.

В классе, где мне нужно использовать внедрение зависимостей, и у меня по умолчанию нет доступа к объекту запроса, мне все еще нужно получить доступ к сеансу через запрос или я могу использовать его напрямую? Вместо этого загрузка запроса и последующий доступ к сеансу кажутся дополнительными издержками.

Я пробовал ниже код, который, кажется, работает нормально. Так почему же большинство примеров и даже документация по-прежнему демонстрируют способ запроса? Я что-то упустил, или в этом подходе есть риск?

класс MyForm расширяет FormBase {

  /**
   * Сессия.
   *
   * @var\Symfony\Component\HttpFoundation\Session\Session
   */
  защищенная $сессия;

  /**
   *
   * @param\Symfony\Component\HttpFoundation\Session\Session $session
   *   Сессия.
   */
  публичная функция __construct($session) {
    $this->session = $session;
  }

  /**
   * {@inheritdoc}
   */
  общедоступная статическая функция create(ContainerInterface $container) {
    вернуть новую статику(
      $контейнер->получить('сеанс')
    );
  }

  функция некоторая функция () {
    $this->session->get('value');
    $this->session->set('value', 'somevalue');
  }

}
Рейтинг:0
флаг cn

... есть ли риск в этом подходе?

Если у вас есть несколько запросов, вы можете получить неправильный объект сеанса. Drupal переместил много вещей из объекта запроса, например, маршрутизацию и даже информацию о пути, но они не реализовали службу сеанса в стеке, а вместо этого сохранили объект сеанса в стеке запроса.

Если вы хотите внедрить этот сервис, в нем уже есть свойство FormBase с методами получения и установки.

Это работает или нет (см. комментарии вверху класса):

$session = $this->getRequest()->getSession();
Neograph734 avatar
флаг co
Спасибо, я не знал, что в форме уже есть метод доступа к запросу; это, очевидно, самый чистый способ. Я до сих пор не совсем понимаю, как может быть больше сеансов для одного пользователя, я бы сказал, что все запросы являются частью одного сеанса. Однако я могу понять, что вторые вкладки и запросы AJAX могут изменить содержимое сеанса.
4uk4 avatar
флаг cn
Например, в тесте вы можете имитировать сеанс, или другой модуль может запустить вашу форму в подзапросе с сеансом, отличным от основного запроса.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.