Bagaimana cara menambahkan Cookie Magento 2?

16

Saya ingin menambahkan COOKIE dengan nilai dan durasi, bagaimana melakukannya di magento 2.

Terima kasih

J. John
sumber

Jawaban:

25

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.

MauroNigrele
sumber
@J. John, Hei! i juts melihat bahwa Anda menerima jawaban sementara saya telah mengeditnya, lihat saja sekarang, karena saya membuat beberapa perubahan untuk menyederhanakan implementasi.
MauroNigrele
3
Aku sudah untuk mengedit createCookieMetaData()untuk createPublicCookieMetadata()di setmetode untuk mengatasi kesalahan (kesalahan fatal). Pendekatan cerdas sekalipun!
RT
apa bedanya antara Magento\Framework\Session\SessionManagerInterfaceyang digunakan oleh Anda dan Magento\Framework\Session\Config\ConfigInterfacedigunakan dalam Magento\Framework\Session\SessionManager?
LucScu
Panggilan fungsi @MauroNigrele dalam metode set dan delete harus createPublicCookieMetadata, bukan createCookieMetadata
Shivam
1
Kawan Saya sudah mengusulkan perubahan karena $this->createPublicCookieMetadata()tidak ada di kelas ini. Seharusnya $this->cookieMetadataFactory->createPublicCookieMetadata() Lihat di repento magento . Tapi aku punya 2 penolakan. LOL ...
spiil
-1

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];
}
Pemburu
sumber