Статьи

Представляем Bucket: минимальный контейнер для внедрения зависимостей для PHP

Я сыт по горло отсутствием приличного DI-контейнера для PHP, поэтому сегодня я создал Bucket . Чтобы было ясно, что я считаю неправильным имеющиеся в настоящее время контейнеры (по крайней мере, о которых я знаю), так это то, что они либо нестабильны, заброшены, требуют много предварительной настройки во внешних XML-файлах или тесно связаны с ними. интегрированы в некоторые фреймворки полного стека. Некоторое время я возлагал надежды на Phemto , но, похоже, прогресс застопорился.

Ведро мало что делает, но на самом деле это и есть намерение. Это означает, что это полнофункциональный и, вероятно, без ошибок. И в отличие от Twittee , это действительно полезно как есть.

Bucket — это, в основном, завершение кода, который я описал год назад в работе с Dependencies . Он добавляет несколько дополнительных функций из коробки. В частности:

Фабрика по умолчанию использует отражения / печатные шрифты для определения зависимостей Итак, вы можете пойти:

class Foo {
}
class Bar {
  function __construct(Foo $foo) {}
}
$container = new bucket_Container();
$container->get('Bar');

И с интерфейсами:

 interface Zap {
}
class Foo implements Zap {
}
class Bar {
  function __construct(Zap $zap) {}
}
$container = new bucket_Container();
$container->registerImplementation('Zap', 'Foo');
$container->get('Bar');

Вы можете использовать обратные вызовы для фабрик . Не очень полезно сейчас, но когда PHP 5.3 (надеюсь, очень скоро) увидит свет, вы можете использовать:

 $bucket = new bucket_Container(
  array(
    'pdo' => function($container) {
      return new PDO("mysql:host=localhost;dbname=addressbook", "root", "secret");
    }
  )
);

Вы также можете использовать фабрику на основе классов. Это может быть объединено с обратными вызовами для переопределения методов. Например. если вы создаете обратный вызов, он имеет приоритет над методом класса. До версии 5.3 вы, вероятно, захотите написать фабрики как методы класса:

 class MyFactory {
  function new_pdo($container) {
    return new PDO("mysql:host=localhost;dbname=addressbook", "root", "secret");
  }
}
$bucket = new bucket_Container(new MyFactory());

Поддержка детских прицелов . Означает, что вы можете создать локальный контейнер, который не передает состояние своему родителю. Вероятно, не самая важная функция для стандартных веб-приложений, но хорошая функция для более длинных скриптов Использование это:

 $container = new bucket_Container();
$scope = $container->makeChildContainer();

Это всего лишь 153 строки кода без каких-либо внешних требований, поэтому вы можете взять свою копию по адресу: http://github.com/troelskn/bucket/tree/master