Привет: Я использую последнюю версию Zend Framework (1.9.3PL1). Я установил следующее в своем .ini

; Bootstrap session resources
resources.session.save_path = APPLICATION_PATH "/../data/sessions"
resources.session.use_only_cookies = true
resources.session.remember_me_seconds = 864000

Затем я хочу инициализировать сеанс в моем загрузчике:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initSession()
    {
        // What goes here!?
    }
}

У меня вопрос, что входит в функцию initSession? Что он должен вернуть, если что?

Кроме того, если я просто запускаю там сеанс, он не распознает конфигурацию .ini (например, save_path не изменяется). Однако, если вы переместите начало на контроллер, конфигурация .ini будет распознана.

РЕДАКТИРОВАТЬ. Возможное решение:

protected function _initSession()
{
    // Based on http://framework.zend.com/issues/browse/ZF-6651
    $session = $this->getPluginResource('session'); 
    $session->init(); 
    Zend_Session::start();
}
8
Jason 25 Сен 2009 в 17:06

3 ответа

Лучший ответ

Если вы используете параметры resources.session.* - в конфигурации вашего приложения, у вас не должно быть метода _initSession() в начальной загрузке, поскольку этот метод переопределит выполнение ресурса подключаемого модуля session (Zend_Application_Resource_Session). Единственный выход из параметров resources.session.* в файле конфигурации гарантирует, что сеанс будет инициализирован в соответствии с вашими параметрами.

Пожалуйста, прочтите Zend_Application, Theory of Operation для подробное обсуждение так называемых методов ресурсов и подключаемых модулей ресурсов .

11
Stefan Gehrig 28 Сен 2009 в 14:51

Стефан совершенно прав, вы переопределяете ресурс сеанса по умолчанию, который использует эти параметры приложения.

Если вы хотите определить свой собственный метод _initSession () и по-прежнему получать доступ к этим параметрам, используйте что-то вроде:

protected function _initSession() 
{
    $options = $this->getOptions();
    $sessionOptions = array(
        'save_path' => $options['resources']['session']['save_path']
    );    
    Zend_Session::setOptions($options);
    Zend_Session::start();
}
7
simonrjones 3 Окт 2009 в 17:20
Некоторая ошибка: должно быть $sessionOptions = array( 'save_path' => $options['session']['save_path'] ); и Zend_Session::setOptions($sessionOptions);
 – 
Wizard
27 Янв 2014 в 12:00
    protected function _initSession()
{
    $config = array();
    $config['db'] = array('adapter'=>'PDO_SQLITE',
                     'params' => array('dbname'=> ROOT.'/data/tmp.db3')

                    );
    $config['SaveHandler'] = array(
        'name'    => 'sessions', //table name as per Zend_Db_Table
        'primary' => array(
            'id',   //the sessionID given by PHP
            'path', //session.save_path
            'name', //session name
        ),
        'primaryAssignment' => array(
            //you must tell the save handler which columns you
            //are using as the primary key. ORDER IS IMPORTANT
            'sessionId', //first column of the primary key is of the sessionID
            'sessionSavePath', //second column of the primary key is the save path
            'sessionName', //third column of the primary key is the session name
        ),
        'modifiedColumn' => 'modified', //time the session should expire
        'dataColumn'     => 'data',     //serialized data
        'lifetimeColumn' => 'lifetime', //end of life for a specific record
    );

    $config['lifetime'] = 60*60*24*30;

    $config['options'] = array (
                          'bug_compat_42' => '',
                          'bug_compat_warn' => '',
                          'cache_expire' => '180',
                          'cache_limiter' => 'nocache',
                          'cookie_domain' => '',
                          'cookie_httponly' => '',
                          'cookie_lifetime' => $config['lifetime'],
                          'cookie_path' => '/',
                          'cookie_secure' => '0',
                          'entropy_file' => '',
                          'entropy_length' => '0',
                          'gc_divisor' => '1000',
                          'gc_maxlifetime' => '1440',
                          'gc_probability' => '1',
                          'hash_bits_per_character' => '5',
                          'hash_function' => '0',
                          'name' => 'TaMeR_SESSID',
                          'referer_check' => '',
                          'save_handler' => 'user',
                          'save_path' => '',
                          'serialize_handler' => 'php',
                          'use_cookies' => '1',
                          'use_only_cookies' => 'on',
                          'use_trans_sid' => '0',
                          'strict' => false,
                          'remember_me_seconds' => $config['lifetime'],
                          'throw_startup_exceptions' => true,
    );

    $db = Zend_Db::factory($config['db']['adapter'], $config['db']['params']);
    if( ! in_array('sessions', $db->listTables())) {
        $sql = "CREATE TABLE sessions (";
        $sql .=     "id TEXT, ";
        $sql .=     "path TEXT, ";
        $sql .=     "name TEXT DEFAULT '', ";
        $sql .=     "modified INTEGER, ";
        $sql .=     "lifetime INTEGER, ";
        $sql .=     "data TEXT, ";
        $sql .=     "PRIMARY KEY (id, path, name)";
        $sql .= ");";
        $db->exec($sql);
    }
    Zend_Db_Table_Abstract::setDefaultAdapter($db);
    Zend_Session::setSaveHandler(new Zend_Session_SaveHandler_DbTable($config['SaveHandler']));
    Zend_Session::setOptions($config['options']);
    Zend_Session::start();
}
3
RoboTamer 18 Мар 2010 в 17:15