Контейнер для инъекций зависимостей
Последнее обновление Jan 28th, 2020 | История страницы | Улучшить эту страницу | Сообщить о проблеме
Support the team building MODX with a monthly donation.
The budget raised through OpenCollective is transparent, including payouts, and any contributor can apply to be paid for their work on MODX.
Backers
Budget
$301 per month—let's make that $500!
Learn moreMODX 3 представляет контейнер для инъекций зависимости, основанный на Pimple 3, который содержит сервисы ядра и кастомные сервисы.
Контейнер доступен в modX:$services
, что означает, что он обычно доступен одним из следующих способов:
-
$modx->services
(в snippets, plugins, и так далее) -
$this->modx->services
(в controllers, processors, и так далее) -
$this->xpdo->services
(в model classes)
Доступные сервисы¶
В это время в ядре автоматически регистрируются следующие сервисы:
-
config
: возвращает массив свойств конфигурации.
Загрузка сервисов¶
Чтобы загрузить сервис из контейнера, вызовите метод get
(и/или has()
метод, чтобы сначала проверить, существует ли он) с идентификатором для сервиса.
try {
$config = $modx->services->get('config');
}
catch (ContainerExceptionInterface $e) {
// handle the thing not being available
}
Или:
$service = null;
try {
if ($modx->services->has('custom-service')) {
$service = $modx->services->get('custom-service');
}
}
catch (ContainerExceptionInterface $e) {
// handle the thing not being available
}
Существующая служба (то есть
has()
, возвращающая true) не является гарантией того, что она не вызовет исключение, когда для нее вызываетсяget()
.
Инъекционные сервисы¶
Рекомендуемый способ внедрения или перезаписи служб в расширении - через namespace's bootstrap.php file, который выполняется как можно раньше в процессе инициализации.
Например, вы можете вызвать:
$modx->services->add('myservice', function($c) use ($modx) {
return new MyPackage\MyService($modx);
});
Вы можете использовать правильное внедрение зависимостей, передавая необходимые сервисы. Гипотетический пример:
$modx->services->add('myservice', function($c) use ($modx) {
return new MyPackage\MyService($c['sessions'], $c['parser']);
});
Если вам требуется, чтобы новый экземпляр возвращался для каждого запроса на обслуживание, используйте метод factory()
:
$modx->services->factory('myservice', function($c) use ($modx) {
return new MyPackage\MyService($modx);
});
Чтобы расширить ранее определенный сервис, используйте extend:
$modx->services->extend('existing-service', function($existing, $c) use ($modx) {
$existing->...();
return $existing;
});
Смотрите документацию Pimple для получения дополнительной информации.
Support the team building MODX with a monthly donation.
The budget raised through OpenCollective is transparent, including payouts, and any contributor can apply to be paid for their work on MODX.
Backers
Budget
$301 per month—let's make that $500!
Learn more