Настройка файлов cookie на Zend Controller

Мы пытаемся создать уникальный идентификатор для каждого пользователя, который посещает наш сайт. Я относительно новичок в 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.

Кто-нибудь использовал файлы cookie таким образом в Zend?


person HjalmarCarlson    schedule 09.08.2012    source источник


Ответы (2)


Если вам нужно установить куки один раз за один сеанс, поместите их в плагин frontController. Добавьте в app.ini
resources.frontController.plugins.a.class = "YourNamespace_Plugin_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, '/');  
      }  
  }  
}  
person criticus    schedule 09.08.2012

Вы также захотите установить путь к файлу cookie (4-й параметр):

setcookie('mx_uid', uniqid('mx_'), $expire, '/');

Имейте в виду, что вы не сможете получить доступ к файлу 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 всегда будет содержать значение.

person Tim Fountain    schedule 09.08.2012
comment
Спасибо Тим! Что касается MVC, я должен настроить это в контроллере или в представлении?? - person HjalmarCarlson; 10.08.2012
comment
Не вид. Трудно понять, где это уместно, не зная, для чего предназначено уникальное значение, но, вероятно, контроллер, если вы используете его только в одном месте, плагин контроллера, если вы хотите использовать его (или он должен быть установлен) для всего сайта. - person Tim Fountain; 10.08.2012