Quiero agregar una COOKIE con valor y algo de duración, cómo hacerlo en magento 2.
Gracias
fuente
Quiero agregar una COOKIE con valor y algo de duración, cómo hacerlo en magento 2.
Gracias
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()
acreatePublicCookieMetadata()
enset
el método para resolver el error (error fatal). Enfoque inteligente sin embargo!Magento\Framework\Session\SessionManagerInterface
utilizado por usted yMagento\Framework\Session\Config\ConfigInterface
utilizado enMagento\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:
fuente