php – ZF2 – 在调度监听器中设置cookie

如果设置了查询参数“source”,我想在监听器中设置cookie.我尝试了以下但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
            ]);
        }
    }

} 

———————————更新—————- ——————-

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

    }
}

最佳答案 似乎您的代码存在一些问题,我们可以先排除这些问题.

>您尚未提供有关如何附加侦听器的代码
>不确定为什么要在请求中设置cookie,您想在响应中执行此操作吗?

附加事件侦听器:

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)
点赞