Como adicionar Cookie Magento 2?

16

Quero adicionar um BOLINHO com valor e alguma duração, como fazê-lo no magento 2.

obrigado

J. John
fonte

Respostas:

25

Na IMO, a melhor abordagem seria criar uma classe para agrupar a criação do cookie e depois usá-la onde quiser.

The Cookie Class

{Fornecedor} / {Módulo} /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
        );
    }
}

Este exemplo foi baseado em Magento \ Framework \ App \ pagecache \ formkey e representam um único cookie com o nome "exemplo"

Se você deseja adicionar algumas propriedades personalizadas aos $ metadados ( PublicCookieMetadata ) como alteração do caminho, http_only, etc, você deve refatorar os métodos set()e / ou delete().

Como usá-lo

Você pode acessar essa classe simplesmente usando o Gerenciador de Objetos em quase qualquer lugar (Abordagem Feia):

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

Dependendo de "onde" você precisa criar o cookie, você pode dar uma olhada no construtor da sua classe, talvez você já tenha um gerenciador de objetos lá; caso contrário, você também pode injetá-lo no construtor.

MauroNigrele
fonte
@J. John, ei! Eu apenas vi que você aceita a resposta enquanto eu a editei, basta dar uma olhada agora, porque fiz várias alterações para simplificar a implementação.
MauroNigrele
3
Eu tenho que editar createCookieMetaData()para createPublicCookieMetadata()no setmétodo para resolver o erro (erro fatal). Abordagem inteligente embora!
RT
qual é a diferença entre Magento\Framework\Session\SessionManagerInterfaceusado por você e Magento\Framework\Session\Config\ConfigInterfaceusado Magento\Framework\Session\SessionManager?
precisa saber é o seguinte
Chamada de função @MauroNigrele em conjunto e método de exclusão deve ser createPublicCookieMetadata vez de createCookieMetadata
Shivam
1
Rapazes. Propus alterações porque $this->createPublicCookieMetadata()não existe nesta classe. Deve ser $this->cookieMetadataFactory->createPublicCookieMetadata() Ver no repositório magento . Mas eu tenho 2 rejeições. LOL ...
spiil
-1

Você pode configurar e obter cookies usando a função básica php, como esta:

//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];
}
Caçador
fonte