Вот несколько советов и предложений, которые, мы надеемся, помогут вам выбрать правильный путь.
Во-первых, при использовании Zend_Session
и / или Zend_Session_Namespace
вы никогда не захотите использовать session_start()
функцию PHP 1 . Если вы начнете сеанс с session_start()
, а затем попытаетесь использовать Zend_Session
, он выдаст исключение, что другой сеанс уже существует.
Поэтому удалите все вызовы session_start()
из приложения Zend Framework.
Во-вторых, вы упомянули, что у вас есть много сообщений, которые нужно хранить, так что, возможно, это не то, что вам нужно, но посмотрите на помощник действий FlashMessenger . Это позволяет вам установить сообщение в контроллере, а затем получить к нему доступ на следующей странице запроса. Сообщения действительны только для одного перехода страницы, поэтому после загрузки следующей страницы они удаляются. Вы можете хранить много сообщений с помощью FlashMessenger, но ваш доступ к ним не очень контролируется. Вы также можете использовать несколько флэш-мессенджеров, каждый из которых находится в разных пространствах имен.
Чтобы решить вашу проблему, в частности, вы можете просто сделать что-то вроде этого:
// in controller that is validating
$errors = new Zend_Session_Namespace('errors');
$errors->client_error = array();
$errors->state_error = array();
// to add errors to each type:
$errors->client_error['some_error'] = 'You had some error, please try again.';
$errors->client_error['other_error'] = 'Other error occurred.';
$errors->client_error[] = 'Other error, not using a named key';
$errors->state_error[] = MY_STATE_PARSING_0;
Здесь происходит то, что мы получаем пространство имен сеанса с именем errors
, создающее новые свойства для client_error
и state_error
, которые оба являются массивами. Технически вам не нужно использовать несколько Zend_Session_Namespaces.
Затем, чтобы очистить сообщения при загрузке следующей страницы, вы можете сделать это:
// from controller again, on the next page load
$errors = new Zend_Session_Namespace('errors');
// get the error arrays
$client_errors = (isset($errors->client_error)) ? $errors->client_error : array();
$state_errors = (isset($errors->state_error)) ? $errors->state_error : array();
unset($errors->client_error, $errors->state_error); // delete from the session
// assign the values to the view
$this->view->client_errors = $client_errors;
$this->view->state_errors = $state_errors;
См. Также исходный код Zend_Controller_Action_Helper_FlashMessenger
, который может дать вам представление об управлении данными в пространствах имен сеансов.