1

私はこのようなコードを持っています:

        $sessionOptions = new SessionDbSavehandlerOptions();
        $sessionOptions->setDataColumn('data')
                       ->setIdColumn('id')
                       ->setModifiedColumn('modified')
                       ->setLifetimeColumn('lifetime')
                       ->setNameColumn('name');
        $application    = $event->getApplication();
        $serviceManager = $application->getServiceManager();
        $dbAdapter = $serviceManager->get('Zend\Db\Adapter\Adapter');
        $sessionTableGateway = new TableGateway('zf2_sessions', $dbAdapter);
        $sessionGateway = new DbTableGateway($sessionTableGateway, $sessionOptions);
        $config = $serviceManager->get('Configuration');
        $sessionConfig = new SessionConfig();
        $sessionConfig->setOptions($config['session']);
        $sessionManager = new SessionManager($sessionConfig);
        $sessionManager->setSaveHandler($sessionGateway);
        $sessionManager->start();
        Container::setDefaultManager($sessionManager);

うまく動作しますが、このコードはファイル内のonBootstrap()メソッドにありModule.phpます。セッションを実装するためのより良い方法 (場所?) はありますか? Controller プラグインは Controller 用ですが、これは何ですか?

4

1 に答える 1

4

私の提案は、これを専用の低レベル モジュールにすることです。完全な構成とインスタンス化を単純なモジュールにカプセル化して、今後のアプリケーションに依存することができます。

これは、メールロギング、およびキャッシュを処理するのとまったく同じです (ただし、キャッシュはまだ完全ではありません)。そのような場合、アプリケーション サービスに挿入できるサービスを作成します。あなたの場合、onBootstrap()メソッドで初期化するリスナー(専用クラスにカプセル化されているかどうかに関係なく)にします。

小さな例:

namespace MySession;

use Zend\Session\Container;

class Module
{
    public function onBootstrap($e)
    {
        $app = $e->getApplication();
        $sm  = $app->getServiceManager();

        $manager = $sm->get('session_manager');
        $manager->start();

        Container::setDefaultManager($manager);
    }

    public function getServiceConfig()
    {
        return array(
            'factories' => array(
                'session_manager' => 'MySession\Service\SessionManagerFactory'
            ),
        );
    }
}

そして、セッション マネージャーのファクトリ ロジックをファクトリ クラスにカプセル化します。

namespace MySession\Service;

use Zend\ServiceManger\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;

// Your imports further here

class SessionManagerFactory implements FactoryInterface
{
    public function createService(ServiceLocatorInterface $sl)
    {
        $sessionOptions = new SessionDbSavehandlerOptions();
        $sessionOptions->setDataColumn('data')
                       ->setIdColumn('id')
                       ->setModifiedColumn('modified')
                       ->setLifetimeColumn('lifetime')
                       ->setNameColumn('name');
        $application    = $event->getApplication();
        $serviceManager = $application->getServiceManager();
        $dbAdapter = $serviceManager->get('Zend\Db\Adapter\Adapter');
        $sessionTableGateway = new TableGateway('zf2_sessions', $dbAdapter);
        $sessionGateway = new DbTableGateway($sessionTableGateway, $sessionOptions);
        $config = $serviceManager->get('Configuration');
        $sessionConfig = new SessionConfig();
        $sessionConfig->setOptions($config['session']);
        $sessionManager = new SessionManager($sessionConfig);
        $sessionManager->setSaveHandler($sessionGateway);

        return $sessionManager;
    }
}
于 2012-12-24T21:08:31.270 に答える