Comment ajouter Cookie Magento 2?

16

Je veux ajouter un COOKIE avec de la valeur et une certaine durée, comment le faire dans magento 2.

Merci

J. John
la source

Réponses:

25

OMI, la meilleure approche serait de créer une classe pour envelopper la création de cookies et ensuite l'utiliser simplement où vous le souhaitez.

La classe des cookies

{Vendor} / {Module} /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
        );
    }
}

Cet exemple était basé sur Magento \ Framework \ App \ PageCache \ FormKey et représente un seul cookie avec le nom "exemple"

Si vous souhaitez ajouter des propriétés personnalisées aux métadonnées $ ( PublicCookieMetadata ) en changeant le chemin, http_only, etc., vous devez refactoriser les méthodes set()et / ou delete().

Comment l'utiliser

Vous pouvez accéder à cette classe en utilisant simplement le gestionnaire d'objets dans presque n'importe où (approche laide):

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

Selon "où" vous devez créer le cookie, vous pouvez jeter un œil au constructeur de votre classe peut-être que vous avez déjà un gestionnaire d'objets là-bas, sinon vous pouvez également l'injecter dans le constructeur.

MauroNigrele
la source
@J. John, hé! i juts a vu que vous acceptiez la réponse pendant que je l'ai éditée, jetez un coup d'œil maintenant, car j'ai apporté plusieurs modifications afin de simplifier la mise en œuvre.
MauroNigrele
3
J'ai à modifier createCookieMetaData()à createPublicCookieMetadata()en setméthode pour résoudre l'erreur (erreur fatale). Une approche intelligente!
RT
Quelle est la différence entre Magento\Framework\Session\SessionManagerInterfaceutilisé par vous et Magento\Framework\Session\Config\ConfigInterfaceutilisé dans Magento\Framework\Session\SessionManager?
LucScu
L'appel de fonction @MauroNigrele dans la méthode set et delete doit être createPublicCookieMetadata au lieu de createCookieMetadata
Shivam
1
Les gars. J'ai proposé des changements car il $this->createPublicCookieMetadata()n'existe pas dans cette classe. Ce devrait être $this->cookieMetadataFactory->createPublicCookieMetadata() See in magento repo . Mais j'ai 2 rejets. LOL ...
spiil
-1

Vous pouvez définir et obtenir des cookies en utilisant la fonction de base php comme ceci:

//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];
}
chasseur
la source