Jawaban:
IMO pendekatan terbaik adalah membuat kelas untuk membungkus pembuatan cookie dan kemudian menggunakannya di mana Anda inginkan.
Kelas Cookie
{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
);
}
}
Contoh ini didasarkan pada Magento \ Framework \ App \ PageCache \ FormKey dan mewakili cookie tunggal dengan nama "contoh"
Jika Anda ingin menambahkan beberapa properti khusus ke $ metadata ( PublicCookieMetadata ) sebagai mengubah jalur, http_only, dll. Anda harus refactorset()
dan / atau delete()
metode.
Bagaimana cara menggunakannya
Anda dapat mengakses kelas itu hanya menggunakan Object Manager di hampir di mana saja (Pendekatan Jelek):
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$objectManager->get('Vendor\Module\Cookie\Example')
->set('value', 3600);
Bergantung "di mana" Anda perlu membuat cookie, Anda bisa melihat konstruktor kelas Anda mungkin Anda sudah memiliki manajer objek di sana, jika tidak, Anda juga dapat menyuntikkannya di konstruktor.
createCookieMetaData()
untuk createPublicCookieMetadata()
di set
metode untuk mengatasi kesalahan (kesalahan fatal). Pendekatan cerdas sekalipun!
Magento\Framework\Session\SessionManagerInterface
yang digunakan oleh Anda dan Magento\Framework\Session\Config\ConfigInterface
digunakan dalam Magento\Framework\Session\SessionManager
?
$this->createPublicCookieMetadata()
tidak ada di kelas ini. Seharusnya $this->cookieMetadataFactory->createPublicCookieMetadata()
Lihat di repento magento . Tapi aku punya 2 penolakan. LOL ...
Anda dapat mengatur & mendapatkan cookie menggunakan fungsi dasar php seperti ini:
//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];
}