【问题标题】:Cookies (Observer) not set when Cache enabled Magento 2.0.7启用缓存 Magento 2.0.7 时未设置 Cookie(观察者)
【发布时间】:2016-12-03 19:02:30
【问题描述】:

我有一个监听器来监听<event name="controller_action_predispatch"> 事件。

观察者的execute方法在每个请求上都正确运行,但是启用缓存时Cookies设置不正确,更具体的Full Page Cache.(System -> Cache Management -> Page Cache)

现在,当我禁用缓存时,cookie 已按预期设置,但从产品列表页面将商品添加到购物车时,右上角的迷你购物车保持空白。实际查看迷你购物车中的商品并能够结帐的唯一方法是首先转到随机产品概览页面,然后从那里将其添加到购物车中。有什么想法吗?

在观察者内部设置 Cookie:

$cookieManager->setPublicCookie('Custom_Cookie', 'This is a Cookie');

观察者类:

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'));

    ...

}

【问题讨论】:

    标签: php magento caching cookies observers


    【解决方案1】:

    我刚刚构建了一个与您正在做的几乎一模一样的扩展。请参阅下面我使用的代码。这应该适合你。

    观察者类:

    <?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;
        }
    }
    

    【讨论】:

      【解决方案2】:

      这是 4 年后,但我遇到了同样的问题 -
      使用了controller_front_send_response_before 事件,它运行良好。

      【讨论】:

        【解决方案3】:

        您有拼写错误。

        改变

        $this->_cookieManger = $cookieManager;
        

        $this->_cookieManager = $cookieManager;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-07-15
          • 1970-01-01
          • 2011-03-10
          • 1970-01-01
          • 2019-06-10
          • 1970-01-01
          • 1970-01-01
          • 2018-08-25
          相关资源
          最近更新 更多