Risposte:
IMO l'approccio migliore sarebbe quello di creare una classe per avvolgere la creazione di cookie e quindi utilizzarlo dove vuoi.
La classe dei cookie
{Venditore} / {} Modulo /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
);
}
}
Questo esempio era basato su Magento \ Framework \ App \ PageCache \ FormKey e rappresenta un singolo cookie con nome "esempio"
Se si desidera aggiungere alcune proprietà personalizzate ai $ metadata ( PublicCookieMetadata ) come modificare il percorso, http_only, ecc., È necessario ricattare i metodi set()e / o delete().
Come usarlo
Puoi accedere a quella classe semplicemente usando l'Object Manager in quasi ovunque (Ugly Approach):
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$objectManager->get('Vendor\Module\Cookie\Example')
->set('value', 3600);
A seconda di "dove" devi creare il cookie, puoi dare un'occhiata al costruttore della tua classe, forse hai già un gestore oggetti lì, altrimenti puoi anche iniettarlo nel costruttore.
createCookieMetaData()a createPublicCookieMetadata()nel setmetodo per risolvere l'errore (errore fatale). Approccio intelligente però!
Magento\Framework\Session\SessionManagerInterfaceusato da te e Magento\Framework\Session\Config\ConfigInterfaceusato in Magento\Framework\Session\SessionManager?
$this->createPublicCookieMetadata()non esiste in questa classe. Dovrebbe essere $this->cookieMetadataFactory->createPublicCookieMetadata() See in magento repo . Ma ho 2 scarti. LOL ...
Puoi impostare e ottenere i cookie utilizzando la funzione di base php in questo modo:
//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];
}