2016-08-25 3 views
3

Я хотел бы установить cookie в прослушиватель, если задан параметр запроса «источник». Я попробовал следующее, но cookie не существует.ZF2 - Установить cookie в диспетчерском прослушивании

Как я могу установить cookie правильно?

class DispatchListener extends AbstractListenerAggregate { 

    public function attach(EventManagerInterface $eventManager) { 
     $this->listeners[] = $eventManager->getSharedManager()->attach(
      'Zend\Stdlib\DispatchableInterface', 
      MvcEvent::EVENT_DISPATCH, 
      array($this, 'setCookie'), 
      -80 
     ); 
    } 

    /** 
    * @var \Zend\Stdlib\RequestInterface 
    */ 
    protected $request; 

    /** 
    * @param \Zend\Stdlib\RequestInterface $request 
    */ 
    public function __construct(RequestInterface $request) { 
     $this->request = $request; 
    } 

    public function setCookie(EventInterface $event) { 
     if ($source = $this->request->getQuery('source')) { 
      $this->request->setCookies([ 
       'source' => $source 
      ]); 
     } 
    } 

} 

--------------------------------- UPDATE --------- --------------------------

class Module implements ConfigProviderInterface, BootstrapListenerInterface { 

    public function onBootstrap(EventInterface $event) { 
     $target = $event->getTarget(); 
     $serviceManager = $target->getServiceManager(); 
     $eventManager = $target->getEventManager(); 

     $eventManager->attach($serviceManager->get('Application\Listener\Dispatch')); 

    } 
} 

ответ

1

Вы хотите, чтобы файл cookie в объекте запроса или вы хотите создать файл cookie для ответа. Вероятно, вы захотите создать файл cookie и установить его на объект ответа.
Проверьте, например, this answer.

public function setCookie(EventInterface $event) { 
    if ($source = $this->request->getQuery('source')) { 
     $cookie = new \Zend\Http\Header\SetCookie('source', $source); 
     $headers = $this->getResponse()->getHeaders(); 
     $headers->addHeader($cookie); 
    } 
} 
1

Похоже, что есть несколько проблем с кодом, который мы можем исключить из первого.

  • Вы не предоставили код для того, как вы подключаете ваш слушатель
  • Не знаю, почему вы устанавливаете куки на запрос, вы хотите сделать это на ответ?

Прикрепление слушателя событий:

public function onBootstrap(MvcEvent $e) 
{ 
    $eventManager = $e->getApplication()->getEventManager(); 
    $app = $e->getApplication(); 
    $em = $app->getEventManager(); 

    // Attach event to attach listener after routing when query will be populated 
    $em->attach(MvcEvent::EVENT_ROUTE, function($e) use ($eventManager) { 
    $request = $e->getRequest(); 
    // attach our listener 
    $eventManager->attach(new DispatchListener($request)); 
    }); 
} 

Обновленный метод SetCookie:

public function setCookie(EventInterface $event) { 
    if ($source = $this->request->getQuery('source')) { 
     $this->request->setCookies([ 
      'source' => $source 
     ]); 

     $request = $this->request; 
     $cookieData = $request->getCookie('someCookie', 'default'); 
     var_dump($cookieData); 
    } 
} 

var_dump печатает следующее:

object(Zend\Http\Header\Cookie)[274] 
    protected 'encodeValue' => boolean true 
    private 'storage' (ArrayObject) => 
    array (size=1) 
    'source' => string 'test' (length=4) 
+0

Я добавил исходный код, в котором я придаю слушателя в моем Module.php. Если я попробую ваш код, я не получу тот же результат, что и вы. Файл cookie не установлен в моем случае. Я просто не хочу устанавливать этот файл cookie, если кто-то вызывает веб-сайт с параметром запроса 'source' :) –

+0

Я все еще не совсем уверен, чего вы пытаетесь достичь, но мой метод работает. Теперь, я думаю, мне нужно будет увидеть ваш заводской код или код установщика для Application \ Listener \ Dispatch в локаторе службы, чтобы понять. Но если вы передаете правильный объект запроса, а событие запускается после события маршрута, оно должно работать. Но все еще не уверен, почему вы хотите установить cookie по запросу –

Смежные вопросы