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でやろうと思った場合は…
- プロジェクトのログイン処理のクラスやフィルターのクラスをエイリアスとして登録し、AuthenticationServiceをインジェクション
- AuthenticationServiceをエイリアスで登録し、AdapterとStorageをエイリアスで登録して
- ZendのAdapterまたは自作Adapterをエイリアスとして登録
- Storageの識別子をコンストラクタインジェクションで設定
- アクションクラス(ページクラス?)でログイン済みかどうかを判定する必要がある場合は、そのクラスに対してAuthenticationServiceのエイリアスをインジェクション
これで一連のセッション処理がエイリアスチェーンで登録できる。
同じことをもう1セットやると、同一パッケージで別々のセッションを持てる。
しかしこれはめんどくさい…。
セッションが一種類だけの場合は、ただAuthenticationServiceにAdapterを設定するだけで使えるのにね。
何か他に良いやり方があるんだろうか。
4/18 追記
再追記
このままではSessionManagerが共有されてしまうので、セッション破棄やlifetime設定などが全て共通となる。
なのでSessionManagerもエイリアス設定しないといけない。
これはZend\Authentication\Storage\Sessionのコンストラクタで指定する。
ちょっと勘違いしていた。
SessionManagerはPHPのsession_*関数をそのまま呼び出すので、複数持つことはできなかった。
詳細は次の記事へ。