Làm cách nào để thêm Cookie Magento 2?


16

Tôi muốn thêm COOKIE với giá trị và thời lượng, làm thế nào để làm điều đó trong magento 2.

Cảm ơn

Câu trả lời:


25

IMO cách tiếp cận tốt nhất sẽ là tạo một lớp để bọc việc tạo cookie và sau đó chỉ cần sử dụng nó ở nơi bạn muốn.

Lớp học bánh quy

{Nhà cung cấp} / {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
        );
    }
}

Ví dụ này được dựa trên Magento \ Framework \ App \ PageCache \ FormKey và đại diện cho một cookie duy nhất có tên "example"

Nếu bạn muốn thêm một số thuộc tính tùy chỉnh vào siêu dữ liệu $ ( PublicCookieMetadata ) khi thay đổi đường dẫn, http_only, v.v., bạn nên cấu trúc lại set()và / hoặc delete()phương thức.

Làm thế nào để sử dụng nó

Bạn có thể truy cập lớp đó chỉ bằng cách sử dụng Trình quản lý đối tượng ở hầu hết mọi nơi (Phương pháp xấu xí):

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$objectManager->get('Vendor\Module\Cookie\Example')
    ->set('value', 3600);

Tùy thuộc vào "nơi" bạn cần tạo cookie, bạn có thể xem hàm tạo của lớp có thể bạn đã có Trình quản lý đối tượng ở đó, nếu không, bạn cũng có thể đưa nó vào hàm tạo.


@J. John, Này! Tôi thấy rằng bạn chấp nhận câu trả lời trong khi tôi đang chỉnh sửa nó, hãy xem ngay bây giờ, vì tôi đã thực hiện một số thay đổi để đơn giản hóa việc thực hiện.
MauroNigrele

3
Tôi đã để chỉnh sửa createCookieMetaData()để createPublicCookieMetadata()trong setphương pháp để giải quyết các lỗi (lỗi nghiêm trọng). Cách tiếp cận thông minh mặc dù!
RT

sự khác biệt giữa Magento\Framework\Session\SessionManagerInterfaceđược sử dụng bởi bạn và Magento\Framework\Session\Config\ConfigInterfaceđược sử dụng trong Magento\Framework\Session\SessionManager?
LucScu

Hàm @MauroNigrele gọi theo phương thức set và xóa phải là createdPublicCookieMetadata thay vì createdCookieMetadata
Shivam

1
Các bạn. Tôi đã đề xuất thay đổi vì $this->createPublicCookieMetadata()không tồn tại trong lớp này. Nó nên được $this->cookieMetadataFactory->createPublicCookieMetadata() xem trong repo magento . Nhưng tôi đã nhận được 2 từ chối. LOL ...
spiil

-1

Bạn có thể đặt và nhận cookie bằng chức năng cơ bản của php như thế này:

//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];
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.