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[
构造。
我有一个文件 (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[
构造。