缓存启用Magento 2.0.7时未设置Cookie(观察者)



我有一个侦听<event name="controller_action_predispatch">事件的观察器。

观察者的执行方法在每个请求上都正确运行,但在启用缓存(更具体地说是全页缓存)时,Cookie设置不正确。CCD_ 2。

现在,当我禁用缓存时,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(
    MagentoFrameworkMessageManagerInterface $messageManager,
    MagentoCheckoutModelCart $cart,
    MagentoFrameworkAppConfigScopeConfigInterface $scopeConfig,
    PsrLogLoggerInterface $logger
) {
    $this->messageManager = $messageManager;
    $this->cart = $cart;
    $this->scopeConfig = $scopeConfig;
    $this->logger = $logger;
}
public function execute(MagentoFrameworkEventObserver $observer)
{
    $objectManager = MagentoFrameworkAppObjectManager::getInstance();
    $cookieManager = $objectManager->get('MagentoFrameworkStdlibCookieManagerInterface');
    $customer = $objectManager->create('MagentoCustomerModelCustomer');
    $product = $objectManager->create('MagentoCatalogModelProduct');
    $cart = $objectManager->get('MagentoCheckoutModelCart');
    $customerSession = $objectManager->get('MagentoCustomerModelSession');
    // COOKIE
    $cookieManager->setPublicCookie('Custom_Cookie', 'This is a Cookie');
    $this->logger->info('COOKIE IS ==> ' . $cookieManager->getCookie('Custom_Cookie'));
    ...
}

我刚刚构建了一个扩展,它几乎与您正在做的完全一样。请参阅下面我使用的代码。这应该对你有用。

观察员类别:

<?php
namespace CompanyModuleObserver;
class AffiliateTracking implements MagentoFrameworkEventObserverInterface
{
    /**
     * @var MagentoFrameworkRegistry
     */
    protected $_registry;
    /**
     * @var MagentoFrameworkAppRequestHttp
     */
    protected $_request;
    /**
     * @var
     */
    protected $_cookieManager;
    /**
     * @var CookieMetadataFactory
     */
    protected $_cookieMetadataFactory;
    protected $_sessionManager;
    /**
     * The affiliate cookie name
     */
    const COOKIE_NAME = "nh_affiliate_id";

    public function __construct(
        MagentoFrameworkRegistry $registry,
        MagentoFrameworkAppRequestHttp $request,
        MagentoFrameworkStdlibCookieManagerInterface $cookieManager,
        MagentoFrameworkStdlibCookieCookieMetadataFactory $cookieMetadataFactory,
        MagentoFrameworkSessionSessionManagerInterface $sessionManager)
    {
        $this->_registry = $registry;
        $this->_request = $request;
        $this->_cookieManger = $cookieManager;
        $this->_cookieMetadataFactory = $cookieMetadataFactory;
        $this->_sessionManager = $sessionManager;
    }
    /**
     * @param MagentoFrameworkEventObserver $observer
     * @return $this
     */
    public function execute(MagentoFrameworkEventObserver $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;
    }
}

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

您有拼写错误。

更改

$this->_cookieManger = $cookieManager;

$this->_cookieManager = $cookieManager;

最新更新