Dużo surfowałem. Chciałbym przypisać i pobrać wartość za pomocą COOKIE. Jak mogę zrobić w ZF2? Widziałem wiele przykładów na przypisywanie wartości do cookie. Wyjaśnij, jak odzyskać wartość z pliku cookie.Zend Framework 2 - Cookie Concept
Odpowiedz
cookie w protokole HTTP (patrz RFC 2109 prostu coś zapisany we wniosku i wysłać każdym razem, gdy wniosek jest składany. Odpowiedź może dodać inne parametry mają być przechowywane dodatkowo do już istniejących plików cookie.
Tak Cookie pobieranie odbywa się poprzez Request
, aby aktualizacji ciasteczko użyć Response
. Zgodnie z RFC 2109 użyć odpowiednio nagłówek Cookie
i nagłówek Set-Cookie
. można w ten sposób uzyskać dostęp do tych nagłówków bezpośrednio poprzez
$this->getRequest()->getHeaders()->get('Cookie')->foo = 'bar';
lub zestaw plików cookie poprzez:
$this->getResponse()->getHeaders()->get('Set-Cookie')->foo = 'bar';
warte są nieco łatwiejsze, choć ponieważ jest pełnomocnikiem na żądanie i odpowiedź na bezpośredni dostęp cookie:
public function fooAction()
{
$param = $this->getRequest()->getCookie()->bar;
$this->getResponse()->getCookie()->baz = 'bat';
}
Twierdzę Uwaga: nagłówki Cookie
i Set-Cookie
implementują obiekt ArrayObject
. Aby sprawdzić, czy plik cookie jest obecny we wniosku, można więc używać offsetExists
:
if ($cookie->offsetExists('foo')) {
$param = $cookie->offsetGet('foo');
}
/aktualizacja:
Jeśli chcesz zmodyfikować właściwości pliku cookie, jesteś tu także modyfikowanie nagłówka Set-Cookie
. Zapoznaj się z at the class on Github dla wszystkich dostępnych metod.
Nieznaczne Podsumowanie:
$cookie = $this->getResponse()->getCookie();
$cookie->foo = 'bar';
$cookie->baz = 'bat';
$this->setDomain('www.example.com');
$this->setExpires(time()+60*60*24*30);
Dostęp cookies przez $this->getResponse()->getCookie()
prace ale jest rozwlekły i męczące. Więc co zrobiłem, rozszerzyłem klasy odpowiedzi i zgłoszeń. Oto jak to wygląda:
'service_manager' => array (
'factories' => array (
'Request' => 'Application\Mvc\Request\Factory',
'Response' => 'Application\Mvc\Response\Factory',
)
);
moduł/Application/src/Application/MVC/Zapytanie/Factory.php
namespace Application\Mvc\Request;
use Zend\Console\Request as ConsoleRequest;
use Zend\Console\Console;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
class Factory implements FactoryInterface
{
public function createService (ServiceLocatorInterface $serviceLocator)
{
if (Console::isConsole())
{
return new ConsoleRequest();
}
return new HttpRequest();
}
}
moduł/Application/src/Application/MVC/Zapytanie/HttpRequest.php
namespace Application\Mvc\Request;
use Zend\Http\PhpEnvironment\Request;
class HttpRequest extends Request
{
public function hasCookie ($name)
{
assert ('is_string($name)');
$cookie = $this->getCookie();
if (empty ($cookie))
{
return false;
}
if (isset ($cookie [$name]))
{
return true;
}
return false;
}
public function cookie ($name, $default = null)
{
assert ('is_string($name)');
if ($this->hasCookie($name))
{
$cookie = $this->getCookie();
return $cookie [$name];
}
return $default;
}
}
moduł/Application/src/Application/MVC/Response/Factory.php
namespace Application\Mvc\Response;
use Zend\Console\Response as ConsoleResponse;
use Zend\Console\Console;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
class Factory implements FactoryInterface
{
public function createService (ServiceLocatorInterface $serviceLocator)
{
if (Console::isConsole())
{
return new ConsoleResponse();
}
return new HttpResponse();
}
}
moduł/Application/src/Application/MVC/Response/HttpResponse.php
namespace Application\Mvc\Response;
use Zend\Http\PhpEnvironment\Response;
use Zend\Http\Header\SetCookie;
class HttpResponse extends Response
{
public function addCookie ($name, $value, $expires = null, $path = null, $domain = null, $secure = false, $httponly = false, $maxAge = null, $version = null)
{
$cookie = new SetCookie ($name, $value, $expires, $path, $domain, $secure, $httponly, $maxAge, $version);
$this->getHeaders()
->addHeader ($cookie);
}
}
Teraz mogę cieszyć się znacznie łatwiejszego dostępu do cookies.
$this->getRequest()->cookie ('ptime');
$this->getRequest()->cookie ('alarm', 'last');
i
$this->getResponse()->addCookie ('ptime', time());
Uwielbiam łatwy dostęp do plików cookie. – Saeven
To tak samo, jak zabicie muchy z armaty. Dlaczego nie utworzyć wtyczki kontrolera, która działałaby jako pośrednik między kontrolerem a żądaniem? –
Może działać, jeśli nie masz logiki ustawień plików cookie w innym miejscu (nie w kontrolerze). – akond
Dziękuję bardzo. Ale, jak mogę ustawić czas wygaśnięcia cookie, nazwę domeny i ścieżkę cookie. – 2plus
Możesz utworzyć nowy nagłówek SetCookie i przypisać go do listy nagłówków obiektu odpowiedzi. Przykład: '$ cookie = new SetCookie ($ name, $ value, $ expires, $ path, $ domain, $ secure, $ httpOnly, $ maxAge, $ version); $ this-> getResponse() -> getHeaders() -> addHeader ($ cookie); '. –
@ 2plus zobacz moją edycję, połączyłem się z klasą SetCookie, w której dostępne są wszystkie modyfikatory. Do mojej odpowiedzi dodałem także krótki przykład kilku setterów. –