Php 在Zend控制器上设置Cookie
我们正试图为访问我们网站的每个用户创建一个唯一的ID。我对Zend和MVC模式比较陌生,所以我不确定cookie应该设置在哪里以及如何设置 php非常直截了当:Php 在Zend控制器上设置Cookie,php,zend-framework,cookies,zend-framework-mvc,Php,Zend Framework,Cookies,Zend Framework Mvc,我们正试图为访问我们网站的每个用户创建一个唯一的ID。我对Zend和MVC模式比较陌生,所以我不确定cookie应该设置在哪里以及如何设置 php非常直截了当: if(!isset($_COOKIE['mx_uid'])){ $expire = time()+60*60*24*30; setcookie('mx_uid', uniqid('mx_'), $expire); } $lxid = $_COOKIE['mx_uid']; 我试图将其放入视图中,但遇到了这样一个问题:在加
if(!isset($_COOKIE['mx_uid'])){
$expire = time()+60*60*24*30;
setcookie('mx_uid', uniqid('mx_'), $expire);
}
$lxid = $_COOKIE['mx_uid'];
我试图将其放入视图中,但遇到了这样一个问题:在加载的每个新页面上都会重新生成cookie,因此如果他们访问站点上的20个页面,那么他们就有20个cookie
此外,我需要在每个页面上内联使用“$lxid”变量而不刷新,因为javascript片段将捕获cookie内容
有人在Zend上以这种方式使用cookie吗?您还需要设置cookie路径(第四个参数): 请注意,您可能无法在设置cookie的同一脚本中访问cookie(即,在他们访问下一页之前cookie不会工作)。因此,更好的逻辑可能是:
if (isset($_COOKIE['mx_uid'])){
$lxid = $_COOKIE['mx_uid'];
} else {
$lxid = uniqid('mx_');
$expire = time()+60*60*24*30;
setcookie('mx_uid', $lxid, $expire, '/');
}
要确保
$lxid
始终包含一个值。如果您需要在一个会话期间设置一次cookie,请将它们放置在frontController插件中。添加到你的app.iniresources.frontController.plugins.a.class=“YourNamespace\u Plugin\u Cookies”
然后你的插件看起来像
class YourNamespace_Plugin_Cookies extends Zend_Controller_Plugin_Abstract
{
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
$cookie = $request->getCookie('mx_uid');
if(empty($cookie)){
setcokkie('mx_uid',$lxid,$expire, '/');
}
}
}
谢谢蒂姆!就MVC而言,我应该在控制器中还是在视图中设置它?而不是在视图中。在不知道唯一值的情况下,很难知道哪里是合适的,但是如果您只在一个地方使用它,可能是控制器,如果您想在站点范围内使用它(或者应该设置它),则可能是控制器插件。
class YourNamespace_Plugin_Cookies extends Zend_Controller_Plugin_Abstract
{
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
$cookie = $request->getCookie('mx_uid');
if(empty($cookie)){
setcokkie('mx_uid',$lxid,$expire, '/');
}
}
}