ZF2 读取 HTTP Cookie

ZF2 read HTTP Cookie

我有一个文件 (caller.php),它在 HTTP 响应中创建一个 cookie,然后重定向到 ZF2 应用程序 (LoginController) 中的一个控制器。

caller.php

setcookie("_ga", "GA1.2.1622977711.1433494392");
setcookie("_gat", "1");

header("Location: http://gnsys.local/publico/login");

登录控制器

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;
use Zend\Http\Response;

class LoginController extends BasePublicController{

public function indexAction(){

    $response = $this->getResponse();

    foreach ($response->getHeaders() as $header) {
        echo "Campo: " . $header->getFieldName() . ' with value ' . $header->getFieldValue() . "<br />";
    }


    return new ViewModel();
}
}

调用 LoginController 时,我没有从 HTTP 响应中得到任何 header。

我做错了什么?为什么我无法从我的 http 响应 headers 中读取任何值?如何从 HTTP 响应中读取所有 header?

如果我做我想做的但只使用 PHP,LoginController 被一个名为 login.php 的文件更改,代码如下:

foreach (getallheaders() as $name => $value) {
    echo "$name: $value</br>";
}

这段代码运行良好,可以满足我的需求。我怎样才能在 Zend Framework 2 中获得相同的内容?

您应该从请求中提取 headers,而不是响应:

foreach ($this->getRequest()->getHeaders() as $header) {
   echo 'Campo: ' . $header->getFieldName() . ' with value ' . $header->getFieldValue() . '<br />';
}

要仅获取 cookie,请使用下一个:

foreach ($this->getRequest()->getCookie() as $name => $value) {
    echo 'Campo: ' . $name . ' with value ' . $value . '<br />';
}

从操作中设置 cookie:

public function callerAction()
{
    $cookie = new \Zend\Http\Header\SetCookie();
    $cookie->setName('foo')
        ->setValue('bar')
        ->setDomain('gnsys.local')
        ->setPath('/')
        ->setHttponly(true);

    /** @var \Zend\Http\Response $response */
    $response = $this->getResponse();
    $response->getHeaders()->addHeader($cookie);

    return $this->redirect()->toUrl('/publico/login');
}

您可以使用我的 zf2-cookie 插件控制器模块 read/write cookies。

安装:

composer require mikica/zf2-cookie

您需要注册新模块。在文件中添加 config/application.config.php:

'modules' => array( '...', 'ZfCookie' ),

控制器中的用法

$this->cookie('key'); //read cookie

$this->cookie('key','value'); //write cookie

我花了一段时间才在 Zend Framework 2 环境中正确设置和读取 cookie。

我在控制器中创建了这两个函数:

private function setCookie($name, $value) {
    $cookie = new SetCookie($name, $value, time() + 3600, '/');
    $this->getResponse()->getHeaders()->addHeader($cookie);
}

private function getCookie($name) {
    $cookie = $this->getRequest()->getCookie();
    if ($cookie->offsetExists($name)) {
        return $cookie->offsetGet($name);
    }
}

我使用它们在重新加载时保持表单字段值,如:

$email_search = $this->params()->fromPost('email_search', '');
$is_submitted = $this->params()->fromPost('is_submitted', '');
if ($is_submitted) {
    $this->setCookie('user_list_email_search', $email_search);
} else {
    $email_search = $this->getCookie('user_list_email_search');
}
$form->get('email_search')->setValue($email_search);

is_submitted表单域是静态隐藏标志:

<input type="hidden" name="is_submitted" value="1">

允许操作员重置为空白电子邮件字段。

有一个更简单的替代方案,检查是否设置了表单字段,这次没有任何 is_submitted 隐藏字段:

$posts = $this->params()->fromPost();
if (isset($posts['email_search'])) {
    $email_search = $posts['email_search'];
    $this->setCookie('user_list_email_search', $email_search);
} else {
    $email_search = $this->getCookie('user_list_email_search');
}
$form->get('email_search')->setValue($email_search);

这一切都取决于 isset($posts[ 构造。