ฉันต้องการเพิ่มคุกกี้ที่มีคุณค่าและระยะเวลาบางอย่างวิธีการทำในวีโอไอพี 2
ขอบคุณ
ฉันต้องการเพิ่มคุกกี้ที่มีคุณค่าและระยะเวลาบางอย่างวิธีการทำในวีโอไอพี 2
ขอบคุณ
คำตอบ:
IMO วิธีที่ดีที่สุดคือการสร้างคลาสเพื่อห่อการสร้างคุกกี้จากนั้นใช้ในที่ที่คุณต้องการ
คลาสคุกกี้
{ผู้ขาย} / {} โมดูล /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
);
}
}
ตัวอย่างนี้มาจากMagento \ Framework \ App \ PageCache \ FormKey และเป็นตัวแทนของคุกกี้เดียวที่มีชื่อ "ตัวอย่าง"
หากคุณต้องการเพิ่มคุณสมบัติที่กำหนดเองบางอย่างใน $ metadata ( PublicCookieMetadata ) เป็นการเปลี่ยนพา ธ http_only ฯลฯ คุณควรปรับโครงสร้างใหม่set()
และ / หรือdelete()
วิธีการ
วิธีใช้งาน
คุณสามารถเข้าถึงคลาสนั้นได้โดยใช้ Object Manager ในเกือบทุกที่ (Ugly Approach):
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$objectManager->get('Vendor\Module\Cookie\Example')
->set('value', 3600);
คุณต้องสร้างคุกกี้คุณสามารถดู Constructor ของคลาสของคุณได้ซึ่งบางทีคุณอาจมี Object Manager อยู่แล้วถ้าไม่คุณสามารถใส่มันลงใน Constructor ได้
createCookieMetaData()
ไปcreatePublicCookieMetadata()
ในset
วิธีการที่จะแก้ไขข้อผิดพลาด (ข้อผิดพลาดร้ายแรง) แม้ว่าวิธีการที่ชาญฉลาด!
Magento\Framework\Session\SessionManagerInterface
ใช้โดยคุณและMagento\Framework\Session\Config\ConfigInterface
ใช้ในMagento\Framework\Session\SessionManager
?
คุณสามารถตั้งค่าและรับคุกกี้โดยใช้ฟังก์ชั่นพื้นฐานของ PHP ดังนี้:
//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];
}