जवाबों:
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 पर आधारित था और नाम "उदाहरण" के साथ एक कुकी का प्रतिनिधित्व करता है
यदि आप $ मेटाडेटा ( PublicCookieMetadata ) में कुछ कस्टम गुण जोड़ना चाहते हैं , तो पथ, http_only, आदि को बदलने के लिए आपको set()
और / या delete()
विधि (s) को रिफ्लेक्टर करना चाहिए ।
इसका इस्तेमाल कैसे करें
आप लगभग कहीं भी ऑब्जेक्ट मैनेजर का उपयोग करके उस वर्ग तक पहुँच सकते हैं (बदसूरत दृष्टिकोण):
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$objectManager->get('Vendor\Module\Cookie\Example')
->set('value', 3600);
"जहाँ" के आधार पर आपको कुकी बनाने की आवश्यकता होती है, आप अपनी कक्षा के निर्माता पर एक नज़र डाल सकते हैं, हो सकता है कि आपके पास पहले से ही एक वस्तु प्रबंधक हो, यदि नहीं तो आप इसे निर्माता में इंजेक्ट भी कर सकते हैं।
createCookieMetaData()
किया createPublicCookieMetadata()
है set
(घातक त्रुटि)। स्मार्ट दृष्टिकोण हालांकि!
Magento\Framework\Session\SessionManagerInterface
आपके द्वारा उपयोग किए जाने वाले और Magento\Framework\Session\Config\ConfigInterface
उपयोग में क्या अंतर है Magento\Framework\Session\SessionManager
?
$this->createPublicCookieMetadata()
इस वर्ग में मौजूद नहीं है। यह $this->cookieMetadataFactory->createPublicCookieMetadata()
Magento के रेपो में देखा जाना चाहिए । लेकिन मुझे 2 रिजेक्ट मिले हैं। LOL ...
आप इस तरह 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];
}