Jump to main content Jump to doc navigation

modX::getService

Устарел в MODX 3.x. xPDO помечает getService() как deprecated и отправляет к контейнеру сервисов ($modx->services). PhpStorm из-за phpdoc предупреждает об удалении в 3.1. Удаления не было. Метод есть в текущих 3.x, ядро само его ещё вызывает. В новом коде берите $modx->services. См. Контейнер внедрения зависимостей.

getService живёт в xPDO (modX его наследует). Загружает и возвращает экземпляр сервиса или null, если класс не поднялся. Экземпляр создаётся один раз. Повторные вызовы отдают тот же объект. В 3.x он ещё кладётся в $modx->services.

Синтаксис

object getService (string $name, [string $class = ''], [string $path = ''], [array $params = array ()])
  • $name (string) ключ сервиса.
  • $class (string) имя класса для new или точечная нотация для подпапок относительно $path.
  • $path (string) каталог с файлом класса.
  • $params (array) второй аргумент конструктора. Первый всегда экземпляр xPDO/MODX.

Определение: xPDO::getService().

Примеры (по-прежнему работают)

Сервис Smarty:

$modx->getService('smarty','smarty.modSmarty');

Свой сервис с путём и параметрами конструктора:

$modx->getService('twitter','modTwitter','/path/to/',array(
  'api_key' => 3212423,
));
$modx->twitter->tweet('Успех!');

В Extra:

// Путь сразу в каталог класса:
if(!$Product = $this->modx->getService('mypkg.product','Product',MODX_CORE_PATH.'components/mypkg/model/mypkg/')) {
    return 'НЕ НАЙДЕН';
}
// Или точечная нотация и $path на каталог модели:
if(!$Product = $this->modx->getService('mypkg.product','mypkg.Product',MODX_CORE_PATH.'components/mypkg/model/')) {
    return 'НЕ НАЙДЕН';
}

У getService бывают проблемы с PHP-пространствами имён. Передайте FQCN или зарегистрируйте объект в контейнере сами.

Замена в MODX 3

Используйте $modx->services (has / add / get). Ядро так делает в modX::runProcessor() для lexicon и error.

Регистрация сервиса ядра (пример: modError):

use MODX\Revolution\Error\modError;

if (!$modx->services->has('error')) {
    $modx->services->add('error', new modError($modx));
}
$modx->error = $modx->services->get('error');

Свой Extra: создайте класс (Composer / autoload namespace) и добавьте его. Обычно это bootstrap.php пространства имён:

$modx->services->add('twitter', function($c) use ($modx) {
    return new MyPackage\Twitter($modx, ['api_key' => 3212423]);
});

Дальше:

$twitter = $modx->services->get('twitter');
$twitter->tweet('Успех!');

modError ($modx->error) и modErrorHandler ($modx->errorHandler) это разные сервисы. Ключи не путайте.

Смотрите также

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

  • modmore
  • STERC
  • Digital Penguin
  • Jens Wittmann – Gestaltung & Entwicklung
  • CrewMark
  • Fabian Christen
  • Sepia River Studios
  • Dannevang Digital
  • Alex
  • A. Moreno
  • Chris Fickling
  • Stéphane Jäggi
  • Murray Wood
  • Anton Tarasov
  • deJaya
  • JT Skaggs
  • Lefthandmedia
  • eydolan
  • Following Sea
  • Guido Gallenkamp
  • YJ
  • Raffy
  • Snow Creative
  • Nick Clark
  • Guest
  • Helen
  • krisznet
  • Yanni
  • Richard

Budget

$204 per month—let's make that $500!

Learn more