ログ日記

作業ログと日記とメモ

Zend\Di でコンストラクタインジェクションをチェーンするのは面倒くさい

一般ユーザー用画面と管理者画面があるとする。この二つで別々のセッション管理をしたい。


その場合、ここにあるようにaliasを設定すれば一応できる。

<?php
// add aliases for specific instances
$im->addAlias('dbadapter-readonly', 'MyLibrary\DbAdapter', array(
    'username' => $config->db->readAdapter->username,
    'password' => $config->db->readAdapter->password,
));
$im->addAlias('dbadapter-readwrite', 'MyLibrary\DbAdapter', array(
    'username' => $config->db->readWriteAdapter->username,
    'password' => $config->db->readWriteAdapter->password,
));

// set a default type to use, pointing to an alias
$im->addTypePreference('MyLibrary\DbAdapter', 'dbadapter-readonly');

$movieListerRead = $di->get('MyMovieApp\MovieLister');
$movieListerReadWrite = $di->get('MyMovieApp\MovieLister', array('dbAdapter' => 'dbadapter-readwrite'));
http://framework.zend.com/manual/2.1/en/modules/zend.di.instance-manager.html

これをZend\Authentication\AuthenticationServiceでやろうと思った場合は…

  1. プロジェクトのログイン処理のクラスやフィルターのクラスをエイリアスとして登録し、AuthenticationServiceをインジェクション
  2. AuthenticationServiceをエイリアスで登録し、AdapterとStorageをエイリアスで登録して
  3. ZendのAdapterまたは自作Adapterをエイリアスとして登録
  4. Storageの識別子をコンストラクタインジェクションで設定
  5. アクションクラス(ページクラス?)でログイン済みかどうかを判定する必要がある場合は、そのクラスに対してAuthenticationServiceのエイリアスをインジェクション

これで一連のセッション処理がエイリアスチェーンで登録できる。
同じことをもう1セットやると、同一パッケージで別々のセッションを持てる。


しかしこれはめんどくさい…。
セッションが一種類だけの場合は、ただAuthenticationServiceにAdapterを設定するだけで使えるのにね。
何か他に良いやり方があるんだろうか。


4/18 追記

追記

このままではSessionManagerが共有されてしまうので、セッション破棄やlifetime設定などが全て共通となる。
なのでSessionManagerもエイリアス設定しないといけない。
これはZend\Authentication\Storage\Sessionのコンストラクタで指定する。


ちょっと勘違いしていた。
SessionManagerはPHPのsession_*関数をそのまま呼び出すので、複数持つことはできなかった。
詳細は次の記事へ。