2013-01-10 23 views
7

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

16

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); 
+0

Dziękuję bardzo. Ale, jak mogę ustawić czas wygaśnięcia cookie, nazwę domeny i ścieżkę cookie. – 2plus

+4

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); '. –

+0

@ 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. –

4

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()); 
+2

Uwielbiam łatwy dostęp do plików cookie. – Saeven

+1

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? –

+0

Może działać, jeśli nie masz logiki ustawień plików cookie w innym miejscu (nie w kontrolerze). – akond