Yanıtlar:
IMO en iyi yaklaşım, çerez oluşturma için bir sınıf oluşturmak ve daha sonra sadece istediğiniz yerde kullanmak olacaktır.
Çerez Sınıfı
{Satıcı} / {Modül} /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
);
}
}
Bu örnek Magento \ Framework \ App \ PageCache \ FormKey temeline dayanır ve "example" adında tek bir çerezi temsil eder
$ Meta verisine ( PublicCookieMetadata ) bazı özel özellikleri yol, http_only, vb. Olarak değiştirmek isterseniz, set()
ve / veya delete()
yöntemleri yeniden düzenlemelisiniz .
Bu nasıl kullanılır
Bu sınıfa hemen hemen her yerde Nesne Yöneticisi'ni kullanarak erişebilirsiniz (Çirkin Yaklaşım):
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$objectManager->get('Vendor\Module\Cookie\Example')
->set('value', 3600);
"Nerede" çerezi oluşturmak gerekir bağlı olarak sınıfın yapıcı bir göz atabilirsiniz belki orada zaten bir Nesne yöneticisi var, eğer değilse de yapıcı enjekte edebilirsiniz.
createCookieMetaData()
için createPublicCookieMetadata()
de set
hatası (önemli hata) çözmek için yöntemiyle. Akıllı bir yaklaşım olsa!
Magento\Framework\Session\SessionManagerInterface
sizin tarafınızdan kullanılan ve Magento\Framework\Session\Config\ConfigInterface
kullanılacak Magento\Framework\Session\SessionManager
?
$this->createPublicCookieMetadata()
bu sınıfta yok. Olması gereken $this->cookieMetadataFactory->createPublicCookieMetadata()
magento repo See . Ama 2 ret aldım. LOL ...
Aşağıdaki gibi php temel işlevini kullanarak çerez ayarlayabilirsiniz ve alabilirsiniz:
//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];
}