¿Cómo agregar Cookie Magento 2?

Respuestas:

25

En mi opinión, el mejor enfoque sería crear una clase para envolver la creación de cookies y luego usarla donde desee.

La clase de las galletas

{Proveedor} / {Módulo} / Galleta / Ejemplo.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 ejemplo se basó en Magento \ Framework \ App \ PageCache \ FormKey y representa una cookie única con el nombre "ejemplo"

Si desea agregar algunas propiedades personalizadas a los metadatos $ ( PublicCookieMetadata ) como cambiar la ruta, http_only, etc., debe refactorizar los métodos set()y / o delete()métodos.

Cómo usarlo

Puede acceder a esa clase simplemente usando el Administrador de objetos en casi cualquier lugar (Enfoque feo):

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

Dependiendo de "dónde" necesita crear la cookie, puede echar un vistazo al constructor de su clase, tal vez ya tenga un administrador de objetos allí, si no, también puede inyectarlo en el constructor.

MauroNigrele
fuente
@J. John, hola! Juts vio que aceptas la respuesta mientras la he estado editando, solo echa un vistazo ahora, porque hice varios cambios para simplificar la implementación.
MauroNigrele
3
Tengo que editar createCookieMetaData()a createPublicCookieMetadata()en setel método para resolver el error (error fatal). Enfoque inteligente sin embargo!
RT
¿Cuál es la diferencia entre Magento\Framework\Session\SessionManagerInterfaceutilizado por usted y Magento\Framework\Session\Config\ConfigInterfaceutilizado en Magento\Framework\Session\SessionManager?
LucScu
La llamada a la función @MauroNigrele en el método set y delete debe ser createPublicCookieMetadata en lugar de createCookieMetadata
Shivam
1
Chicos He propuesto cambios porque $this->createPublicCookieMetadata()no existe en esta clase. Debería ser $this->cookieMetadataFactory->createPublicCookieMetadata() See in magento repo . Pero tengo 2 rechazos. LOL ...
spiil
-1

Puede configurar y obtener cookies utilizando la función básica php de esta manera:

//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];
}
Cazador
fuente