Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
// Объявление сервисов
$container['session_storage'] = function ($c) {
return new $c['session_storage_class']($c['cookie_name']);
};
$container['session'] = function ($c) {
return new Session($c['session_storage']);
};
$container['user_controller'] = $container->share(function ($c) {
return new UserController(
$c['session_storage']
);
});
class FooImpl : IFoo
{
Foo(IBar dependency){}
}
class BarImpl : IBar
{
}
class Target
{
Target(IFoo dependency)
}
//Тут привязки в произвольном порядке
container.Bind<IFoo>().To<FooImpl>();
container.Bind<IBar>().To<BarImpl>().InSingletonScope();
//Просим контейнер создать экземпляр класса, имеющего зависимости.
container.Resolve<Target>();
locator.Set<IBar>(new BarImpl());
locator.Set<IFoo>(()=> new FooImpl(locator.Get<IBar>());
new Target(locator.Get<IFoo>());
что при использовании service locator мы завязываемся на конкретную имплементацию сервисаНет, не завязываемся, лишь на «интерфейс», который в php достигается утиной типизацией. Строго говоря в статье Pimple используется для Dependency Injection (зависимости всё же приходят через конструктор, а не заполняются в нём через $locator['service']), но сам по себе реализует именно Service Locator, так как представляет собой банальный реестр и не способен самостоятельно создавать инстансы.
$container['session'] = function ($c) {
return new Session($c['sessionStorage']);
};
<component id="session" type="Session">
<sessionStorage>${sessionStorage}</emailFormatter>
</component>
Pimple? Не… Не слышал