2013-05-14 14 views
5

Çerezleri okuyabilen ve yazabilen bir servisim var. Bunu Symfony benzeri bir şekilde yapmak için hizmetin istek ve yanıta erişimi olmalıdır. İsteğin hizmet yapılandırması aracılığıyla hizmete iletilmesinin mümkün olduğunu hayal edebiliyorum, ama nasıl olduğunu bilmiyorum. Hizmete nasıl çerez yazabileceğimi bilmiyorum. Bunun nasıl yapılacağına dair herhangi bir öneri takdir edilecektir.Symfony 2 servisine çerezleri okuma ve yazma yeteneği verebilir miyim?

Not: Her kullandığımda değişkenleri servise manuel olarak aktarmak istemiyorum.

cevap

12

Sanırım gerçekten bir kaç seçeneğiniz var - gerçekten bir çerezde depolamaya çalıştığınız şeye ve işlemin hangi noktasında okumaya ihtiyacınız olduğuna bağlı.

services: 
    a_service: 
     class:  Acme\DemoBundle\RequestServiceClass 
     arguments: [@request] 
     scope: request 
:

Ben

services.yml içinde hizmetinizi tanımlayın ... İlk seçenek bu isteği erişmek vardır ve döndüren bir yanıt oluşturur, bir hizmet yaratmaktır önermek

Sınıfınız:

//Acme\DemoBundle\RequestServiceClass.php 
class RequestServiceClass 
{ 
    private $request; 
    public function __construct(Request $request){ 
     $this->request= $request; 
    } 

    public function doSomething(){ 
     // get cookie 
     $value = $this->request->cookies->get('cookie'); 

     // create cookie 
     $cookie = new Cookie('cookie', 'value', time() + 3600 * 24 * 7); 
     // create response 
     $response = new Response(); 
     // set cookie in response 
     $response->headers->setCookie($cookie); 
     return $response; 
    } 
} 

Sonra hizmeti kullanmak için bu

böyle bir şey yapmak
public myAction() 
{ 
    $response = $this->get('a_service')->doSomething(); 
    return $response; 
} 

bunu yapmanın başka yolu ... bir kernel.response dinleyici oluşturmaktır onun böyle yapılır:

services.yml bir hizmet ekleyin:

services: 
    a_listener: 
    class: Acme\DemoBundle\MyListener 
    tags: 
     - { name: kernel.event_listener, event: kernel.response, method: onKernelResponse } 

telsizinde sınıfı şöyle :

2 yöntem arasındaki fark bilgilenme sürecinin bir anda kullanılabilir ne
// Acme\DemoBundle\MyListener.php 

class MyListener 
{ 
    public function onKernelResponse(FilterResponseEvent $event) 
    { 
     $response = $event->getResponse(); 
     $request = $event->getRequest(); 

     // get cookie 
     $value = $request->cookies->get('cookie'); 

     // create cookie 
     $cookie = new Cookie('cookie', 'value', time() + 3600 * 24 * 7); 
     // set cookie in response 
     $response->headers->setCookie($cookie); 
    } 
} 

- örneğin hizmet geçmek ... RESPO her şeye erişebilir nse dinleyicinin istek ve cevaptaki her şeye erişimi vardır - yanıtın beklendiği gibi olup olmadığını (yani format veya içerik) kontrol edebilir ve buna göre bir çerez kurabilirsiniz. bazı yararlı belgelerine

bazı bağlantılar okumak için:

+2

Yanıt etkinliği dinleyicisi mükemmel bir çözüm gibi görünüyor! Teşekkürler. – Hubro

1

HTTP HTTP ilgili olayların kontrolörleri ve dinleyici durur. Bir servis (bir denetleyici veya bir HTTP olay dinleyicisi olmayan) çerezleri ayarlamamalı veya almamalıdır. Bunun yerine denetleyici çerezleri işlemelidir. Hizmetin argüman olarak kabul eden ve yeni değerini döndüren ya da bir referans-referans argümanını kullanan yöntemleri tüketmeden önce verileri cookie'den alır. Bu şekilde hizmetiniz HTTP'den ayrıştırılır ve test edilmek üzere kolayca yeniden kullanılabilir ans