Php 在Zend控制器上设置Cookie

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']; 我试图将其放入视图中,但遇到了这样一个问题:在加

我们正试图为访问我们网站的每个用户创建一个唯一的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'];
我试图将其放入视图中,但遇到了这样一个问题:在加载的每个新页面上都会重新生成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.ini
resources.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, '/');  
      }  
  }  
}