Cookie Magento 2를 추가하는 방법?


답변:


25

IMO의 가장 좋은 방법은 쿠키 생성을 래핑하는 클래스를 만든 다음 원하는 곳에서 사용하는 것입니다.

쿠키 클래스

{Vendor} / {Module} /Cookie/Example.php

<?php 

namespace Vendor\Module\Cookie;

use Magento\Framework\Stdlib\CookieManagerInterface;
use Magento\Framework\Stdlib\Cookie\CookieMetadataFactory;
use Magento\Framework\Session\SessionManagerInterface;

class Example
{
    /**
     * Name of cookie that holds private content version
     */
    const COOKIE_NAME = 'example';

    /**
     * CookieManager
     *
     * @var CookieManagerInterface
     */
    private $cookieManager;

    /**
     * @var CookieMetadataFactory
     */
    private $cookieMetadataFactory;

    /**
     * @var SessionManagerInterface
     */
    private $sessionManager;

    /**
     * @param CookieManagerInterface $cookieManager
     * @param CookieMetadataFactory $cookieMetadataFactory
     * @param SessionManagerInterface $sessionManager
     */
    public function __construct(
        CookieManagerInterface $cookieManager,
        CookieMetadataFactory $cookieMetadataFactory,
        SessionManagerInterface $sessionManager
    ) {
        $this->cookieManager = $cookieManager;
        $this->cookieMetadataFactory = $cookieMetadataFactory;
        $this->sessionManager = $sessionManager;
    }

    /**
     * Get form key cookie
     *
     * @return string
     */
    public function get()
    {
        return $this->cookieManager->getCookie(self::COOKIE_NAME);
    }

    /**
     * @param string $value
     * @param int $duration
     * @return void
     */
    public function set($value, $duration = 86400)
    {
        $metadata = $this->cookieMetadataFactory
            ->createPublicCookieMetadata()
            ->setDuration($duration)
            ->setPath($this->sessionManager->getCookiePath())
            ->setDomain($this->sessionManager->getCookieDomain());

        $this->cookieManager->setPublicCookie(
            self::COOKIE_NAME,
            $value,
            $metadata
        );
    }

    /**
     * @return void
     */
    public function delete()
    {
        $metadata = $this->cookieMetadataFactory
            ->createPublicCookieMetadata()
            ->setDuration($duration)
            ->setPath($this->sessionManager->getCookiePath())
            ->setDomain($this->sessionManager->getCookieDomain());

        $this->cookieManager->deleteCookie(
            self::COOKIE_NAME,
            $metadata
        );
    }
}

이 예제는 Magento \ Framework \ App \ PageCache \ FormKey를 기반으로 하며 이름이 "example"인 단일 쿠키를 나타냅니다.

경로, http_only 등을 변경 하여 $ metadata ( PublicCookieMetadata ) 에 일부 사용자 지정 속성을 추가하려는 경우 set()및 / 또는 delete()메서드를 리팩터링해야합니다 .

사용 방법

거의 모든 곳에서 Object Manager를 사용하여 해당 클래스에 액세스 할 수 있습니다 (Ugly Approach).

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$objectManager->get('Vendor\Module\Cookie\Example')
    ->set('value', 3600);

"where"에 따라 쿠키를 생성해야합니다. 클래스의 생성자를 살펴볼 수 있습니다. 생성자에 삽입 할 수 없다면 이미 Object Manager가있을 수 있습니다.


@제이. 존! 나는 단지 구현을 단순화하기 위해 몇 가지 변경을했기 때문에 그것을 편집하는 동안 대답을 받아들이는 것을 봤습니다.
MauroNigrele

3
내가 편집을했습니다 createCookieMetaData()createPublicCookieMetadata()set오류 (치명적인 오류)를 해결하는 방법. 똑똑한 접근!
RT

의 차이는 무엇 Magento\Framework\Session\SessionManagerInterface당신이 사용하고 Magento\Framework\Session\Config\ConfigInterface있는 사용 Magento\Framework\Session\SessionManager?
LucScu

set 및 delete 메소드의 @MauroNigrele 함수 호출은 createCookieMetadata 대신 createPublicCookieMetadata 여야합니다.
Shivam

1
여러분 $this->createPublicCookieMetadata()이 수업에는 존재하지 않기 때문에 변경을 제안했습니다 . 그것은해야 $this->cookieMetadataFactory->createPublicCookieMetadata() 젠토의 REPO에 참조 . 하지만 2 건의 거절이 있습니다. LOL ...
11

-1

다음과 같은 PHP 기본 기능을 사용하여 쿠키를 설정하고 얻을 수 있습니다.

//set cookie
$cookie_name = "magento";
$cookie_value = "How to Cookie";
setcookie($cookie_name, $cookie_value, time()+3600); /* expire in 1 hour */

//get cookie
if(!isset($_COOKIE[$cookie_name])) {
    echo "Cookie named '" . $cookie_name . "' is not set!";
} else {
    echo "Cookie '" . $cookie_name . "' is set!<br>";
    echo "Value is: " . $_COOKIE[$cookie_name];
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.