Wie füge ich Cookie Magento 2 hinzu?

16

Ich möchte ein COOKIE mit Wert und einer gewissen Dauer hinzufügen , wie es in Magento 2 gemacht wird.

Vielen Dank

J. John
quelle

Antworten:

25

IMO wäre der beste Ansatz, eine Klasse zu erstellen, um die Cookie-Erstellung zu verpacken und sie dann einfach dort zu verwenden, wo Sie möchten.

Die Cookie-Klasse

{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
        );
    }
}

Dieses Beispiel basiert auf Magento \ Framework \ App \ PageCache \ FormKey und repräsentiert ein einzelnes Cookie mit dem Namen "example".

Wenn Sie den $ -Metadaten ( PublicCookieMetadata ) einige benutzerdefinierte Eigenschaften hinzufügen möchten , indem Sie den Pfad, http_only usw. ändern, sollten Sie die set()und / oder delete()Methode (n) umgestalten .

Wie man es benutzt

Sie können auf diese Klasse einfach mit dem Objekt-Manager an fast jedem Ort zugreifen (Ugly Approach):

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

Abhängig davon, wo Sie das Cookie erstellen müssen, können Sie sich den Konstruktor Ihrer Klasse ansehen. Vielleicht haben Sie dort bereits einen Objektmanager, wenn nicht, können Sie ihn auch in den Konstruktor einfügen.

MauroNigrele
quelle
@J. John, Hey! Ich habe kürzlich gesehen, dass Sie die Antwort akzeptieren, während ich sie bearbeite. Schauen Sie sich das jetzt an, da ich einige Änderungen vorgenommen habe, um die Implementierung zu vereinfachen.
MauroNigrele
3
Ich muss in Methode bearbeiten createCookieMetaData(), um den Fehler zu beheben (schwerwiegender Fehler). Schlauer Ansatz! createPublicCookieMetadata()set
RT
Was ist der Unterschied zwischen Magento\Framework\Session\SessionManagerInterfacevon Ihnen und in Magento\Framework\Session\Config\ConfigInterfaceverwendet Magento\Framework\Session\SessionManager?
LucScu
@ MauroNigrele Funktionsaufruf in Set und Delete-Methode sollte createPublicCookieMetadata anstelle von createCookieMetadata sein
Shivam
1
Jungs. Ich habe Änderungen vorgeschlagen, weil $this->createPublicCookieMetadata()es in dieser Klasse keine gibt. Es sollte $this->cookieMetadataFactory->createPublicCookieMetadata() in Magento Repo angezeigt werden . Aber ich habe 2 Ablehnungen bekommen. LOL ...
Spiil
-1

Sie können Cookies mit der folgenden PHP-Grundfunktion setzen und erhalten:

//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];
}
Jäger
quelle