2013-05-14 9 views
5

Ich habe einen Dienst, der in der Lage sein soll, Cookies zu lesen und zu schreiben. Um dies in einer Symfony-ähnlichen Weise zu tun, muss der Dienst Zugriff auf die Anfrage und die Antwort haben. Ich kann mir vorstellen, dass es möglich ist, die Anfrage über die Dienstkonfiguration an den Dienst zu übergeben, aber ich weiß nicht wie. Ich bin mir nicht sicher, wie ich dem Dienst die Möglichkeit geben soll, Cookies zu schreiben. Irgendwelche Vorschläge, wie man dies tut, würde geschätzt werden.Kann ich einem Symfony 2-Dienst die Möglichkeit geben, Cookies zu lesen und zu schreiben?

Hinweis: Ich möchte wirklich nicht Variablen manuell an den Dienst jedes Mal übergeben müssen, wenn ich es verwende.

Antwort

12

Ich denke, Sie haben wirklich ein paar Optionen - es hängt wirklich davon ab, was Sie in einem Cookie speichern möchten und an welchem ​​Punkt des Prozesses Sie lesen müssen, um die Arbeit zu tun.

Ich schlage vor, Ihre erste Option ist, einen Dienst zu erstellen, dass die die Anforderung Zugriff hat und erzeugt eine Antwort, die es gibt ...

Ihren Dienst in services.yml definieren:

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

Ihre Klasse:

//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; 
    } 
} 

Dann Ihren Service nutzen Sie tun so etwas wie dieses

public myAction() 
{ 
    $response = $this->get('a_service')->doSomething(); 
    return $response; 
} 

Der andere Weg, es zu tun, ist ein kernel.response Zuhörer ... seine wie dies getan zu schaffen:

hinzufügen Service services.yml:

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

Ihre Zuhörer Klasse sieht wie folgt aus :

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

der Unterschied zwischen den zwei Verfahren ist, welche Informationen zum Zeitpunkt des Prozesses zur Verfügung steht - zum Beispiel hat die Service-Zugriff auf alles, was Sie es passieren ... die respo nse Listener hat Zugriff auf alles in der Anfrage und der Antwort - Sie können überprüfen, ob die Antwort wie erwartet ist (dh Format oder Inhalt) und dann einen Cookie entsprechend setzen.

Einige Links zu einigen nützlichen Dokumentation zu lesen:

+2

Der Antwort Event Listener sieht wie die perfekte Lösung aus! Vielen Dank. – Hubro

1

HTTP an den Controllern und Hörern von HTTP-bezogene Ereignisse stoppt. Ein Dienst (der kein Controller oder HTTP-Ereignis-Listener ist) sollte keine Cookies setzen oder abrufen. Stattdessen sollte der Controller den Cookie behandeln. Es ruft die Daten aus dem Cookie ab, bevor es die Methoden des Dienstes verwendet, die es als Argument akzeptieren und seinen neuen Wert zurückgeben oder ein Verweis-Argument verwenden. Auf diese Weise ist Ihr Dienst von HTTP abgekoppelt und kann einfach wieder verwendet und getestet werden

Verwandte Themen