2016-09-23 2 views
1

Ich versuche, ein Cookie auf der zweiten Seite Anfrage innerhalb der Modul.php zu setzen. Meine Session-Einrichtung für die Seitenanforderung funktioniert gut, aber irgendwie ist das Cookie nicht gesetzt. Gibt es eine Erklärung, warum dieser Cookie nicht gesetzt ist?ZF2 Set-Cookie innerhalb des Moduls

module.php

public function onBootstrap(MvcEvent $e) 
    { 
     $application   = $e->getApplication(); 
     $eventManager  = $application->getEventManager(); 
     $moduleRouteListener = new ModuleRouteListener(); 
     $moduleRouteListener ->attach($eventManager); 
     $serviceManager  = $application->getServiceManager(); 
     //.. 
     if (php_sapi_name() !== 'cli') { 
      //.... 
      $this->_setUserTrackingCookie($serviceManager); 
     } 
    } 

    private function _setUserTrackingCookie($serviceManager) 
    { 
     $request = $serviceManager->get('Request'); 
     $headers = $request->getHeaders(); 
     $cookies = $request->getCookie(); 
     if (!$cookies->offsetExists('fzz')) { 
      $acceptingCookies = new Container('fzz'); 
      if (!$acceptingCookies->offsetExists('requests')) { 
       $acceptingCookies->offsetSet('requests', 1); 
      } else { 
       $cookieSalt   = Rand::getString(32, 'abcdefghijklmnopqrstuvwxyz1234567890', true); 
       $dbAdapter   = $serviceManager->get('Zend\Db\Adapter\Adapter'); 
       $table    = new \Application\Model\UserCookieTable($dbAdapter); 
       $userCookie   = new UserCookie(); 
       $userCookie->salt = $cookieSalt; 
       $userCookie->country = $country; 
       $table    ->insertUserCookie($userCookie); 
       $locationCookie  = new SetCookie('fzz', 'testing_cookie', strtotime('+1 Year', time()), '/'); 
       $headers    ->addHeader($locationCookie); 
      } 
     } 
    } 

Antwort

0

Triming Sie Ihren Code ein wenig, der Cookie-Einstellung Teil lautet:

$request = $serviceManager->get('Request'); 
$headers = $request->getHeaders(); 
$locationCookie = new SetCookie('fzz', 'testing_cookie', strtotime('+1 Year', time()), '/'); 
$headers->addHeader($locationCookie); 

Sie ein ein Cookie an die Representation of the Request hinzufügen. Während dies für die Darstellung recht gut funktioniert, können wir die Anfrage natürlich nicht ändern.

Was Sie wirklich wollen, ist die Cookie-Header an den Response statt hinzuzufügen:

$response = $serviceManager->get('Response'); 
$headers = $response ->getHeaders(); 
$locationCookie = new SetCookie('fzz', 'testing_cookie', strtotime('+1 Year', time()), '/'); 
$headers->addHeader($locationCookie); 

Es ist übrigens eine Zf-way von für eine tatsächliche HTTP-Anforderung überprüft:

if ($request instanceof \Zend\Http\PhpEnvironment\Request) { 
    $headers = $response ->getHeaders(); 
    $locationCookie = new SetCookie('fzz', 'testing_cookie', strtotime('+1 Year', time()), '/'); 
    $headers->addHeader($locationCookie); 
} 

Auf der CLI wird $request stattdessen eine Instanz von Zend\Console\Request sein.