ZF2 ServiceManagerをPimple風に使う
Service-LocatorモデルでやりたいことはPimpleのようなスマートさなんですが、ZF2は公式ドキュメントがいまいちわかりづらいので、ソース見ながら調べたらこんなんできました。
まずはcomposerでインストール
composer.json
{ "repositories": [ { "type": "composer", "url": "https://packages.zendframework.com/" } ], "require": { "zendframework/zend-servicemanager":"2.*" } }
Pimple風な使い方
require_once 'vendor/autoload.php'; $sm = new \Zend\ServiceManager\ServiceManager(); $sm->setFactory('hoge', function ($locator, $cName, $rName) { $obj = new \stdClass(); $obj->hoge = 'hogehoge'; $obj->cName = $cName; $obj->rName = $rName; return $obj; }); $sm->setFactory('var', function ($locator) { $hoge = clone($locator->get('hoge')); $hoge->var = 'varvar'; return $hoge; }); var_dump($sm->get('hoge'), $sm->get('var'));
出力結果
object(stdClass) { ["hoge"]=> string(8) "hogehoge" ["cName"]=> string(4) "hoge" ["rName"]=> string(4) "hoge" } object(stdClass) { ["hoge"]=> string(8) "hogehoge" ["cName"]=> string(4) "hoge" ["rName"]=> string(4) "hoge" ["var"]=> string(6) "varvar" }
上記のようにしても一箇所にFactoryクラスをまとめて作っておいても、お好きな組み込み方で