Меленький и в тоже время мощный контейнер внедрения зависимостей через публичные свойства, с использованием карты зависимостей
Перед тем как использовать PDIC в вашем проекте, добавьте его в файл composer.json:
./composer.phar require cheevauva/pdic "1.1.*"
Сервис - это объект, который что-то делает как часть более крупной системы. Примеры сервисов: подключение к базе данных, шаблонизатор или почтовая программа
$map = [
'?session_storage' => SessionStorage::class,
'?session' => Session::class,
SessionStorage::class => [
'^1' => '@sessionId',
],
Session::class => [
'^1' => '?session_storage'
],
];
$container = new \PDIC\Container($map, [
'sessionId' => 'SESSION_ID',
]);
Поскольку объекты создаются только тогда, когда вы их получаете, порядок определений не имеет значения.
Использовать определенные сервисы очень просто:
$container->get('session');
Вышеупомянутый вызов примерно эквивалентен следующему коду:
$storage = new SessionStorage('SESSION_ID');
$session = new Session($storage);
По умолчанию каждый раз, когда вы получаете сервис, PDIC возвращает один и тот же ее экземпляр. Если вы хотите, чтобы для всех вызовов возвращался другой экземпляр, объявите карту зависимостей следующим образом
$map = [
'?session_storage' => SessionStorage::class,
'?session' => '*' . Session::class,
SessionStorage::class => [
'^1' => '@sessionId',
],
Session::class => [
'^1' => '?session_storage'
],
];
Теперь каждый вызов:
$container->get('session');
возвращает новый экземпляр Session
Определение параметра позволяет упростить настройку сущностей в вашем контейнере. Параметры передаются при создании экземпляра контейнера:
$container = new \PDIC\Container([
'?filesystem' => Filesystem::class,
Filesystem::class => [
'^1' => '@basePath',
]
], [
'basePath' => __DIR__ . '/',
]);