익명 사용자를위한 데이터 / 세션 저장


12

나는 상점에서 일하고 있는데, 장바구니의 경우 지불하기 전에 품목을 저장해야합니다.

  $tempstore = \Drupal::service('user.private_tempstore')->get('boutique');
  $tempstore->set('poids', $form_state->getValue('poids'));

나는 사용자 서비스를 살펴 본다 :

pivate_tempstore 및 shared_tempstore

그러나 그것은 사용자를 인증하기 위해서만 작동합니다.

스토어 데이터에 무엇을 사용할 수 있습니까? $ _SESSION? 또는 Drupal 8은 그 서비스를 제공합니까?


쿠키를 사용하고 있습니다. 식별자와 해시 쿠키가 있으며 유효성을 검사 한 다음 식별자를 필요한 것과 쌍을 이룹니다. D8은 익명 사용자에게도 세션 사용을 중단했기 때문에 세션을 사용하지 않습니다.

좋아 그리고 왜 $ _SESSION을 사용하지 않습니까?
케빈

답변:


11

Drupal 8에서 세션 변수는 요청에서 액세스 할 수 있습니다.

$session = \Drupal::request()->getSession();

세션에서 무언가를 설정하려면 다음을 수행하십시오.

$profile = 'Person';
$session->set('profile', $profile);

또는 세션 변수를 검색하려면

$details = $session->get('profile');

1
시도해 볼 것이므로 배열을 저장할 수 있습니까?
Kevin

1
예, 배열을 저장할 수 있습니다. 질문과 일치하도록 코드를 변경했지만 실제로 배열을 저장하고 있습니다.
Duncanmoo

3
다른 솔루션을 작동시키기 위해 고군분투-이것은 매우 간단하고 실제로 작동하는 것 같습니다
Nate

세션 변수를 삭제하는 방법?
siddiq

완벽하게 작업 해 주셔서 감사합니다
Kevin

17

늦은 답변이지만 tempstore가 활성 세션에 액세스 할 수있는 한 익명 사용자에게 개인 tempstore를 사용할 있습니다. 이렇게하려면 다음과 같이 임시 저장소, 세션 및 현재 사용자를위한 서비스를 클래스에 주입해야합니다.

public function __construct(PrivateTempStoreFactory $temp_store_factory, SessionManagerInterface $session_manager, AccountInterface $current_user) {
    $this->tempStoreFactory = $temp_store_factory;
    $this->sessionManager = $session_manager;
    $this->currentUser = $current_user;

    $this->store = $this->tempStoreFactory->get('myclass.storename');
}

public static function create(ContainerInterface $container) {
    return new static(
        $container->get('user.private_tempstore'),
        $container->get('session_manager'),
        $container->get('current_user')
    );
}

그런 다음 사용자가 익명 인 경우 임시 저장소에 항목을 추가하기 전에 세션 관리자를 시작해야합니다.

if ($this->currentUser->isAnonymous() && !isset($_SESSION['session_started'])) {
    $_SESSION['session_started'] = true;
    $this->sessionManager->start();
}

이 방법은 사용자의 로그인 여부에 관계없이 단일 시스템을 임시 스토리지에 사용할 수 있기 때문에 선호되는 방법 일 수 있습니다.

(내 코드 예제는 다단계 양식 작성에 대한이 훌륭한 자습서 에서 다소 간결하게 해제되었습니다 .)


흥미롭게도, 나는 그것에 대해 살펴볼 것이다. 그러나 나는이 접근법을 좋아한다
Kevin

Drupal 8 (포스트 베타 6) drupal.org/node/2228871 에서 세션을 시작하는 방법에 대해 살펴보십시오 . 아마도 답에서 두 번째 코드 조각을 수정해야 할 것입니다.
David Riccitelli


3

세션은 익명 일 수 있습니다 (uid = 0). $ _SESSION을 사용하면 drupal이이를 처리합니다.

세션 데이터 저장 :

$_SESSION['mymodule']['variablename'] = $tempdata;

세션 데이터를 가져옵니다.

$tempdata = $_SESSION['mymodule']['variablename'];

업데이트 1 : 세션 객체

여전히 D8 코어에서 작업이 진행되는 동안이 문제를 참조하십시오. $ _SESSION의 용도를 요청에서 검색된 심포니 세션으로 변환 요청 에서 세션 오브젝트를 사용하여 세션 데이터를 저장할 수 있습니다. 그러나 이러한 방법 중 하나를 사용하여 저장 한 데이터는 다른 방법으로는 사용할 수 없습니다. Drupal 8 및 Session Management에 대한 자세한 내용은이 답변을 참조하십시오 .

class MymoduleSessionCounter {
  function increment(Request $request) {
    $session = $request->getSession();
    $value = $session->get('mymodule_count', 0);
    $session->set('mymodule_count', $value + 1);

    return $value;
  }
}

업데이트 2 : TempStore

TempStore는 D8에서 매우 인기있는 것 같습니다. 그러나이 질문과 같은 값을 저장하는 것은 너무 복잡합니다. 예를 들어 미리보기 데이터 또는 저장되지 않은 뷰와 같은 많은 양의 데이터를 대상으로합니다. 공식 변경 기록은 다음과 같습니다.

Request 객체를 통해 세션 데이터에 액세스

비 캐시 데이터의 영구적이고 만료 가능한 저장을 위해 TempStore API 추가


예 세션은 익명이지만 사용자 서비스에는 적용되지 않습니다.
Kevin

Drupal 8에서 모범 사례는 인터페이스를 사용하여 세션 변수에 대한 데이터를 읽고 쓰도록 지시하는 것입니다. 이를 통해 교체 가능한 스토리지와 더 밝은 미래가 가능합니다.
조지

1

$this->sessionManager->start();때문에 마지막 업데이트의 나를 위해 더 이상 작동하지 않는. 나는 그것을로 바꿨다.$this->sessionManager->regenerate();


이것을 새로운 답변이 아닌 원래 답변에 대한 주석으로 추가해야합니다.
wranvaud

1
@ wranvaud, 나는 다른 대답에 대해 논평 할 수있는 평판이 충분하지 않았습니다.
Dan Poenaru
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.