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クラスをまとめて作っておいても、お好きな組み込み方で