Odpowiedzi:
IMO najlepszym podejściem byłoby utworzenie klasy do zawijania tworzenia plików cookie, a następnie użycie go w dowolnym miejscu.
Klasa 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
);
}
}
Ten przykład został oparty na Magento \ Framework \ App \ PageCache \ FormKey i reprezentuje pojedynczy plik cookie o nazwie „przykład”
Jeśli chcesz dodać niestandardowe właściwości do metadanych $ ( PublicCookieMetadata ) w celu zmiany ścieżki, tylko http_on itp., Powinieneś refaktoryzować metodę set()i / lub delete()metody.
Jak tego użyć
Możesz uzyskać dostęp do tej klasy po prostu za pomocą Menedżera obiektów w prawie dowolnym miejscu (brzydkie podejście):
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$objectManager->get('Vendor\Module\Cookie\Example')
->set('value', 3600);
W zależności od tego, gdzie chcesz utworzyć plik cookie, możesz spojrzeć na konstruktora swojej klasy. Być może masz już menedżera obiektów, jeśli nie, możesz także wstrzyknąć go do konstruktora.
createCookieMetaData(), aby createPublicCookieMetadata()w setsposób rozwiązać ten błąd (błąd krytyczny). Jednak inteligentne podejście!
Magento\Framework\Session\SessionManagerInterfaceużytym przez Ciebie a Magento\Framework\Session\Config\ConfigInterfaceużytym Magento\Framework\Session\SessionManager?
$this->createPublicCookieMetadata()nie istnieją w tej klasie. Powinien to być $this->cookieMetadataFactory->createPublicCookieMetadata() See in magento repo . Ale dostaję 2 odrzuty. LOL ...
Możesz ustawić i uzyskać plik cookie za pomocą podstawowej funkcji php, takiej jak ta:
//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];
}