kkkdev’s 開発 備忘録

残しておきたい開発情報を記録します。

Pimple + yaml2pimple で依存性のコードからの分離をシンプルに実現

PimpleでDIを行うにしても

$container['key'] = function ($c) {...

みたいな初期化は自分で記述する必要があるのですが、 yaml2pimpleを使うと、
Symfony/DependencyInjection のように yamlから自動的にインスタンス生成/依存性の注入を行ってくれます。

github.com

導入前

  $container['apiAdapter'] = function ($c) {
      return new APIAdapter();
  };

  $container['api'] = function ($c) {
      return new TrueAPI($c['apiAdapter']);
  };

導入後

[PHP]

$container = new Container();
//yamlから依存性を読み込む
$builder = new ContainerBuilder($container);
$locator = new FileLocator(__DIR__);
$loader = new YamlFileLoader($builder, $locator);
$loader->load(__DIR__ . '/services.yml');

[yaml]

parameters:
  name: aaa # 実際使わなくても、必要がある

services:
  apiAdapter:
    class:   APIAdapter
    arguments:  [@api]
  api:
    class:   FakeAPI

yamlを書き換えるだけで依存を変更できるようになりました。

nesbot.com

上記ページのようにSlim frameworkのController初期化を遅延させたりするのにも使えそうです。

https://github.com/gonzalo123/yml2pimple/commits/master
factory等のメソッド対応もマージ済のようです。

サンプルコード

github.com 前述の内容のサンプルです。(composer install → test.phpを実行)