How to use Zend 2 save handler DbTableGateway?

后端 未结 2 406
孤街浪徒
孤街浪徒 2021-01-23 08:58

The Zend\\Session Save Handler tutorial gives an example for DbTableGateway in which they create a TableGateway with an undefined $adapter variable. I want to use the handler to

相关标签:
2条回答
  • 2021-01-23 09:40

    I have this code for save a session to a db table.

    'service_manager' => array(
        'factories' => array(
            'Zend\Session\SessionManager' => function (\Zend\ServiceManager\ServiceManager $sm) {
                $sessionConfig = new \Zend\Session\Config\SessionConfig();
                $sessionConfig->setOptions(
                    array(
                        'use_cookies' => true,
                        'name' => 'ed2',
                        'gc_maxlifetime' => 1728000
                    )
                );
    
                /* @var $adapter \Zend\Db\Adapter\Adapter */
                $adapter = $sm->get('Zend\Db\Adapter\Adapter');
                $tableGateway = new \Zend\Db\TableGateway\TableGateway('session', $adapter);
                $saveHandler  = new \Common\Session\SaveHandler\DbTableGateway(
                    $tableGateway,
                    new \Zend\Session\SaveHandler\DbTableGatewayOptions()
                );
    
                $sessionManager = new \Zend\Session\SessionManager($sessionConfig);
                $sessionManager->setSaveHandler($saveHandler);
                $sessionManager->start();
                return $sessionManager;
            },
        )
    )
    

    Config for db

    'db' => array(
        'driver'    => 'Pdo_Mysql',
        'database'  => 'release',
        'username'  => 'username',
        'password'  => 'password',
        'hostname'  => '127.0.0.1',
        'driver_options' => array(
            PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
        )
    ),
    'service_manager' => array(
        'factories' => array(
            'Zend\Db\Adapter\Adapter' => function (\Zend\ServiceManager\ServiceManager $serviceManager) {
                $adapterFactory = new Zend\Db\Adapter\AdapterServiceFactory();
                $adapter = $adapterFactory->createService($serviceManager);
    
                Zend\Db\TableGateway\Feature\GlobalAdapterFeature::setStaticAdapter($adapter);
    
                return $adapter;
            }
        )
    )
    
    0 讨论(0)
  • 2021-01-23 09:48

    The answer turned out to be like newage's answer:

    Since newage edited his answer to include the db adapter, I've accepted it as the right answer. The rest of this is just my implementation:

    You can remove all the TableGateway and savehandler logic from the bootstrapSession method and put it in the getServiceConfig method.

    Add the definition for Adapter to the 'factories' array in getServiceConfig, then modify the 'Zend\Session\SessionManager' function to include the Adapter, TableGateway, and save handler. This is what the new getServiceConfig would look like:

    public function getServiceConfig()
    {
        return array(
            'factories' => array(
    
                // New code here
                'Zend\Db\Adapter\Adapter' => 'Zend\Db\Adapter\AdapterServiceFactory',
                // New code here
    
                'Zend\Session\SessionManager' => function ($sm) {
                    $config = $sm->get('config');
                    if (isset($config['session'])) {
                        $session = $config['session'];
    
                        $sessionConfig = null;
                        if (isset($session['config'])) {
                            $class = isset($session['config']['class'])  ? $session['config']['class'] : 'Zend\Session\Config\SessionConfig';
                            $options = isset($session['config']['options']) ? $session['config']['options'] : array();
                            $sessionConfig = new $class();
                            $sessionConfig->setOptions($options);
                        }
    
                        $sessionStorage = null;
                        if (isset($session['storage'])) {
                            $class = $session['storage'];
                            $sessionStorage = new $class();
                        }
    
                        $sessionSaveHandler = null;
                        if (isset($session['save_handler'])) {
                            // class should be fetched from service manager since it will require constructor arguments
                            $sessionSaveHandler = $sm->get($session['save_handler']);
                        }
                        $sessionManager = new SessionManager();
                    }
    
                    // New code here
                    /* @var $adapter \Zend\Db\Adapter\Adapter */
                    $adapter = $sm->get('Zend\Db\Adapter\Adapter');
                    $tableGateway = new TableGateway('mytablename', $adapter);
                    $saveHandler  = new DbTableGateway($tableGateway, new DbTableGatewayOptions());
                    $sessionManager->setSaveHandler($saveHandler);
                    // New code here
    
                    Container::setDefaultManager($sessionManager);
                    return $sessionManager;
                },
            ),
        );
    }
    

    Then add the database connection info to the module's config file:

    return array(
        // ...
        'db' => array(
            'driver'         => 'Pdo',
            'dsn'            => 'mysql:dbname=mydbname;host=mydbhost;port=xxxx',
            'driver_options' => array(
                PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
            ),
            'username'       => 'dbusername',
            'password'       => 'dbpassword',
        ),
    );
    
    0 讨论(0)
提交回复
热议问题