Respuestas:
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.
createCookieMetaData()
a createPublicCookieMetadata()
en set
el método para resolver el error (error fatal). Enfoque inteligente sin embargo!
Magento\Framework\Session\SessionManagerInterface
utilizado por usted y Magento\Framework\Session\Config\ConfigInterface
utilizado en Magento\Framework\Session\SessionManager
?
$this->createPublicCookieMetadata()
no existe en esta clase. Debería ser $this->cookieMetadataFactory->createPublicCookieMetadata()
See in magento repo . Pero tengo 2 rechazos. LOL ...
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];
}