Magento dispose de ses méthodes pour mettre en place des cookies, et les supprimer.
Il est déconseillé de passer par les méthodes de base de PHP.
Créer un cookie
Nous allons commencer par créer un controller pour tester notre ajout de cookie :
app/code/Maxime/Jobs/Controller/Cookie/Testaddcookie.php
Mettez-y le code suivant :
<?php namespace Maxime\Jobs\Controller\Cookie; class Testaddcookie extends \Magento\Framework\App\Action\Action { const JOB_COOKIE_NAME = 'jobs'; const JOB_COOKIE_DURATION = 86400; // lifetime in seconds /** * @var \Magento\Framework\Stdlib\CookieManagerInterface */ protected $_cookieManager; /** * @var \Magento\Framework\Stdlib\Cookie\CookieMetadataFactory */ protected $_cookieMetadataFactory; /** * @param \Magento\Framework\App\Action\Context $context * @param \Magento\Framework\Stdlib\CookieManagerInterface $cookieManager * @param \Magento\Framework\Stdlib\Cookie\CookieMetadataFactory $cookieMetadataFactory */ public function __construct( \Magento\Framework\App\Action\Context $context, \Magento\Framework\Stdlib\CookieManagerInterface $cookieManager, \Magento\Framework\Stdlib\Cookie\CookieMetadataFactory $cookieMetadataFactory ) { $this->_cookieManager = $cookieManager; $this->_cookieMetadataFactory = $cookieMetadataFactory; parent::__construct($context); } public function execute() { $metadata = $this->_cookieMetadataFactory ->createPublicCookieMetadata() ->setDuration(self::JOB_COOKIE_DURATION); $this->_cookieManager->setPublicCookie( self::JOB_COOKIE_NAME, 'MY COOKIE VALUE', $metadata ); echo('COOKIE OK'); } }
Notez que vous n’êtes pas obligés de passer par une classe particulière, vous pouvez injecter le CookieMetadataFactory et le cookieManager dans la classe de votre choix en l’ajoutant dans la méthode construct.
Maintenant rendez vous à l’URL suivante :
http://magento2.lan/jobs/cookie/testaddcookie
Si vous regardez vos cookies vous devriez voir celui que l’on vient de créer :
Sa durée de vie est de 24h (86400 secondes).
Vous pouvez également choisir le path et le domain de votre cookie :
$metadata = $this->_cookieMetadataFactory ->createPublicCookieMetadata() ->setPath('YOUR PATH') ->setDomain('YOUR DOMAIN') ->setDuration(self::JOB_COOKIE_DURATION);
Lire un cookie
Pour lire le cookie que nous venons de créer, nous allons ajouter un nouveau controller :
app/code/Maxime/Jobs/Controller/Cookie/Testgetcookie.php
Avec le code suivant :
<?php namespace Maxime\Jobs\Controller\Cookie; class Testgetcookie extends \Magento\Framework\App\Action\Action { /** * @var \Magento\Framework\Stdlib\CookieManagerInterface */ protected $_cookieManager; /** * @param \Magento\Framework\App\Action\Context $context * @param \Magento\Framework\Stdlib\CookieManagerInterface $cookieManager */ public function __construct( \Magento\Framework\App\Action\Context $context, \Magento\Framework\Stdlib\CookieManagerInterface $cookieManager ) { $this->_cookieManager = $cookieManager; parent::__construct($context); } public function execute() { $cookieValue = $this->_cookieManager->getCookie(\Maxime\Jobs\Controller\Cookie\Testaddcookie::JOB_COOKIE_NAME); echo($cookieValue); } }
Nous n’avons pas besoin de CookieMetadata ici, le cookieManager nous suffit.
Si vous allez sur la page :
http://magento2.lan/jobs/cookie/testgetcookie
Vous verrez la valeur du cookie que l’on vient de créer.
Supprimer un cookie
Nous allons créer notre dernier controller pour supprimer le cookie :
app/code/Maxime/Jobs/Controller/Cookie/Testdeletecookie.php
Qui contient :
<?php namespace Maxime\Jobs\Controller\Cookie; class Testdeletecookie extends \Magento\Framework\App\Action\Action { /** * @var \Magento\Framework\Stdlib\CookieManagerInterface */ protected $_cookieManager; /** * @param \Magento\Framework\App\Action\Context $context * @param \Magento\Framework\Stdlib\CookieManagerInterface $cookieManager */ public function __construct( \Magento\Framework\App\Action\Context $context, \Magento\Framework\Stdlib\CookieManagerInterface $cookieManager ) { $this->_cookieManager = $cookieManager; parent::__construct($context); } public function execute() { $this->_cookieManager->deleteCookie( \Maxime\Jobs\Controller\Cookie\Testaddcookie::JOB_COOKIE_NAME ); echo('COOKIE DELETED'); } }
Notez qu’il est également possible de définir le path et le domain du cookie à supprimer, celà nécessite d’ajouter l’objet cookieMetadataFactory à votre classe et voici le code à utiliser :
$this->_cookieManager->deleteCookie( \Maxime\Jobs\Controller\Cookie\Testaddcookie::JOB_COOKIE_NAME, $this->_cookieMetadataFactory ->createCookieMetadata() ->setPath('YOUR PATH') ->setDomain('YOUR DOMAIN') );
La méthode crado
Il est possible de passer par l’objectManager pour récupérer le cookieManager et ainsi créer votre cookie où vous le souhaitez :
$objectManager = \Magento\Framework\App\ObjectManager::getInstance(); $cookieManager = $objectManager->get('Magento\Framework\Stdlib\CookieManagerInterface'); // set cookie value $cookieManager->setPublicCookie('unclean_cookie', 'Unclean Value'); //get cookie value $cookieManager->getCookie('unclean_cookie');
Mais cette méthode n’est pas du tout conseillée !