【问题标题】:ZF2 read HTTP CookieZF2 读取 HTTP Cookie
【发布时间】:2016-01-20 23:48:47
【问题描述】:

我有一个文件 (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 响应中得到任何标头。

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

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

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

这段代码运行良好,可以满足我的需求。如何在 Zend Framework 2 中获得相同的效果?

【问题讨论】:

    标签: php zend-framework cookies http-headers httpresponse


    【解决方案1】:

    我花了一段时间才在 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[ 构造。

    【讨论】:

      【解决方案2】:

      您可以使用我的 zf2-cookie 插件控制器模块来读取/写入 cookie。

      安装:

      composer require mikica/zf2-cookie

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

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

      在控制器中的使用

      $this-&gt;cookie('key'); //read cookie

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 谢谢!!!!它工作正常,但我没有得到 cookie 的价值。请看我的下一个答案!!!
        • 对不起,但我试图仅使用 php 而不是在 zf2 下创建 cookie。这有什么问题吗?
        • 嗨!!!如果我使用 ZF2 调用调用者,我得到的结果与使用 php 文件 (caller.php) 调用调用者的结果相同。这就是我所拥有的:Campo:zdt-hidden,值为 0
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-14
        • 2011-06-07
        • 2015-07-13
        相关资源
        最近更新 更多