缓存启用 Magento 2.0.7 时未设置 Cookie(观察者)
Cookies (Observer) not set when Cache enabled Magento 2.0.7
我有一个监听 <event name="controller_action_predispatch">
事件的观察者。
观察者的执行方法在每个请求上都是正确的 运行,但是启用缓存时 Cookie 设置不正确,更具体地说是全页缓存。(System -> Cache Management -> Page Cache)
。
现在,当我禁用缓存时,cookie 会按预期设置,但是当从产品列表页面将项目添加到购物车时,右上角的迷你购物车仍然是空的。真正看到迷你购物车中的商品并能够结帐的唯一方法是首先转到随机产品概览页面,然后从那里将其添加到购物车。有什么想法吗?
在观察者内部设置 Cookies:
$cookieManager->setPublicCookie('Custom_Cookie', 'This is a Cookie');
观察者class:
class MyObserver implements ObserverInterface {
protected $messageManager;
protected $cart;
protected $scopeConfig;
protected $logger;
public function __construct(
\Magento\Framework\Message\ManagerInterface $messageManager,
\Magento\Checkout\Model\Cart $cart,
\Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
\Psr\Log\LoggerInterface $logger
) {
$this->messageManager = $messageManager;
$this->cart = $cart;
$this->scopeConfig = $scopeConfig;
$this->logger = $logger;
}
public function execute(\Magento\Framework\Event\Observer $observer)
{
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$cookieManager = $objectManager->get('Magento\Framework\Stdlib\CookieManagerInterface');
$customer = $objectManager->create('Magento\Customer\Model\Customer');
$product = $objectManager->create('Magento\Catalog\Model\Product');
$cart = $objectManager->get('Magento\Checkout\Model\Cart');
$customerSession = $objectManager->get('Magento\Customer\Model\Session');
// COOKIE
$cookieManager->setPublicCookie('Custom_Cookie', 'This is a Cookie');
$this->logger->info('COOKIE IS ==> ' . $cookieManager->getCookie('Custom_Cookie'));
...
}
我刚刚构建了一个几乎与您正在做的完全一样的扩展。请查看我在下面使用的代码。这应该适合你。
观察者Class:
<?php
namespace Company\Module\Observer;
class AffiliateTracking implements \Magento\Framework\Event\ObserverInterface
{
/**
* @var \Magento\Framework\Registry
*/
protected $_registry;
/**
* @var \Magento\Framework\App\Request\Http
*/
protected $_request;
/**
* @var
*/
protected $_cookieManager;
/**
* @var CookieMetadataFactory
*/
protected $_cookieMetadataFactory;
protected $_sessionManager;
/**
* The affiliate cookie name
*/
const COOKIE_NAME = "nh_affiliate_id";
public function __construct(
\Magento\Framework\Registry $registry,
\Magento\Framework\App\Request\Http $request,
\Magento\Framework\Stdlib\CookieManagerInterface $cookieManager,
\Magento\Framework\Stdlib\Cookie\CookieMetadataFactory $cookieMetadataFactory,
\Magento\Framework\Session\SessionManagerInterface $sessionManager)
{
$this->_registry = $registry;
$this->_request = $request;
$this->_cookieManger = $cookieManager;
$this->_cookieMetadataFactory = $cookieMetadataFactory;
$this->_sessionManager = $sessionManager;
}
/**
* @param \Magento\Framework\Event\Observer $observer
* @return $this
*/
public function execute(\Magento\Framework\Event\Observer $observer)
{
$affiliateId = $this->_request->getParam("SSAID", false);
if ($affiliateId)
{
$publicCookieMetadata = $this->_cookieMetadataFactory->createPublicCookieMetadata()
->setDuration(2592000)
->setPath($this->sessionManager->getCookiePath())
->setDomain($this->sessionManager->getCookieDomain())
->setHttpOnly(false);
$this->_cookieManager->setPublicCookie(self::COOKIE_NAME,
$affiliateId,
$publicCookieMetadata
);
}
return $this;
}
}
您有拼写错误。
改变
$this->_cookieManger = $cookieManager;
到
$this->_cookieManager = $cookieManager;
这是 4 年后的事了,但我遇到了同样的问题 -
使用了 controller_front_send_response_before
事件并且效果很好。
我有一个监听 <event name="controller_action_predispatch">
事件的观察者。
观察者的执行方法在每个请求上都是正确的 运行,但是启用缓存时 Cookie 设置不正确,更具体地说是全页缓存。(System -> Cache Management -> Page Cache)
。
现在,当我禁用缓存时,cookie 会按预期设置,但是当从产品列表页面将项目添加到购物车时,右上角的迷你购物车仍然是空的。真正看到迷你购物车中的商品并能够结帐的唯一方法是首先转到随机产品概览页面,然后从那里将其添加到购物车。有什么想法吗?
在观察者内部设置 Cookies:
$cookieManager->setPublicCookie('Custom_Cookie', 'This is a Cookie');
观察者class:
class MyObserver implements ObserverInterface {
protected $messageManager;
protected $cart;
protected $scopeConfig;
protected $logger;
public function __construct(
\Magento\Framework\Message\ManagerInterface $messageManager,
\Magento\Checkout\Model\Cart $cart,
\Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
\Psr\Log\LoggerInterface $logger
) {
$this->messageManager = $messageManager;
$this->cart = $cart;
$this->scopeConfig = $scopeConfig;
$this->logger = $logger;
}
public function execute(\Magento\Framework\Event\Observer $observer)
{
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$cookieManager = $objectManager->get('Magento\Framework\Stdlib\CookieManagerInterface');
$customer = $objectManager->create('Magento\Customer\Model\Customer');
$product = $objectManager->create('Magento\Catalog\Model\Product');
$cart = $objectManager->get('Magento\Checkout\Model\Cart');
$customerSession = $objectManager->get('Magento\Customer\Model\Session');
// COOKIE
$cookieManager->setPublicCookie('Custom_Cookie', 'This is a Cookie');
$this->logger->info('COOKIE IS ==> ' . $cookieManager->getCookie('Custom_Cookie'));
...
}
我刚刚构建了一个几乎与您正在做的完全一样的扩展。请查看我在下面使用的代码。这应该适合你。
观察者Class:
<?php
namespace Company\Module\Observer;
class AffiliateTracking implements \Magento\Framework\Event\ObserverInterface
{
/**
* @var \Magento\Framework\Registry
*/
protected $_registry;
/**
* @var \Magento\Framework\App\Request\Http
*/
protected $_request;
/**
* @var
*/
protected $_cookieManager;
/**
* @var CookieMetadataFactory
*/
protected $_cookieMetadataFactory;
protected $_sessionManager;
/**
* The affiliate cookie name
*/
const COOKIE_NAME = "nh_affiliate_id";
public function __construct(
\Magento\Framework\Registry $registry,
\Magento\Framework\App\Request\Http $request,
\Magento\Framework\Stdlib\CookieManagerInterface $cookieManager,
\Magento\Framework\Stdlib\Cookie\CookieMetadataFactory $cookieMetadataFactory,
\Magento\Framework\Session\SessionManagerInterface $sessionManager)
{
$this->_registry = $registry;
$this->_request = $request;
$this->_cookieManger = $cookieManager;
$this->_cookieMetadataFactory = $cookieMetadataFactory;
$this->_sessionManager = $sessionManager;
}
/**
* @param \Magento\Framework\Event\Observer $observer
* @return $this
*/
public function execute(\Magento\Framework\Event\Observer $observer)
{
$affiliateId = $this->_request->getParam("SSAID", false);
if ($affiliateId)
{
$publicCookieMetadata = $this->_cookieMetadataFactory->createPublicCookieMetadata()
->setDuration(2592000)
->setPath($this->sessionManager->getCookiePath())
->setDomain($this->sessionManager->getCookieDomain())
->setHttpOnly(false);
$this->_cookieManager->setPublicCookie(self::COOKIE_NAME,
$affiliateId,
$publicCookieMetadata
);
}
return $this;
}
}
您有拼写错误。
改变
$this->_cookieManger = $cookieManager;
到
$this->_cookieManager = $cookieManager;
这是 4 年后的事了,但我遇到了同样的问题 -
使用了 controller_front_send_response_before
事件并且效果很好。