답변:
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가있을 수 있습니다.
createCookieMetaData()
에 createPublicCookieMetadata()
에 set
오류 (치명적인 오류)를 해결하는 방법. 똑똑한 접근!
Magento\Framework\Session\SessionManagerInterface
당신이 사용하고 Magento\Framework\Session\Config\ConfigInterface
있는 사용 Magento\Framework\Session\SessionManager
?
$this->createPublicCookieMetadata()
이 수업에는 존재하지 않기 때문에 변경을 제안했습니다 . 그것은해야 $this->cookieMetadataFactory->createPublicCookieMetadata()
젠토의 REPO에 참조 . 하지만 2 건의 거절이 있습니다. LOL ...
다음과 같은 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];
}