จะเพิ่ม Cookie Magento 2 ได้อย่างไร


คำตอบ:


25

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 และเป็นตัวแทนของคุกกี้เดียวที่มีชื่อ "ตัวอย่าง"

หากคุณต้องการเพิ่มคุณสมบัติที่กำหนดเองบางอย่างใน $ metadata ( PublicCookieMetadata ) เป็นการเปลี่ยนพา ธ http_only ฯลฯ คุณควรปรับโครงสร้างใหม่set()และ / หรือdelete()วิธีการ

วิธีใช้งาน

คุณสามารถเข้าถึงคลาสนั้นได้โดยใช้ Object Manager ในเกือบทุกที่ (Ugly Approach):

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

คุณต้องสร้างคุกกี้คุณสามารถดู Constructor ของคลาสของคุณได้ซึ่งบางทีคุณอาจมี Object Manager อยู่แล้วถ้าไม่คุณสามารถใส่มันลงใน Constructor ได้


@J จอห์นเฮ้! ฉันเห็นว่าคุณยอมรับคำตอบในขณะที่ฉันกำลังแก้ไขอยู่ลองดูตอนนี้เพราะฉันทำการเปลี่ยนแปลงหลายอย่างเพื่อให้การใช้งานง่ายขึ้น
MauroNigrele

3
ฉันจะแก้ไขcreateCookieMetaData()ไปcreatePublicCookieMetadata()ในsetวิธีการที่จะแก้ไขข้อผิดพลาด (ข้อผิดพลาดร้ายแรง) แม้ว่าวิธีการที่ชาญฉลาด!
RT

สิ่งที่แตกต่างระหว่างการMagento\Framework\Session\SessionManagerInterfaceใช้โดยคุณและMagento\Framework\Session\Config\ConfigInterfaceใช้ในMagento\Framework\Session\SessionManager?
LucScu

ฟังก์ชั่น @MauroNigrele ในการตั้งค่าและวิธีการลบควรจะ createPublicCookieMetadata แทน createCookieMetadata
Shivam

1
ผู้ชาย ฉันเสนอการเปลี่ยนแปลงเพราะ$this->createPublicCookieMetadata()ไม่มีในชั้นนี้ มันควรจะ$this->cookieMetadataFactory->createPublicCookieMetadata() ดูใน repo แต่ฉันได้รับการปฏิเสธ 2 ครั้ง ฮ่า ๆ ...
2560

-1

คุณสามารถตั้งค่าและรับคุกกี้โดยใช้ฟังก์ชั่นพื้นฐานของ 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];
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.