Добавление сервиса в Elgg

В руководстве по сервисам содержится общая информация об использовании сервисов Elgg.

Чтобы добавить новый объект сервиса в Elgg:

  1. Пометьте ваш класс как @internal, если это внутренний сервис.

  2. Откройте класс Elgg\Di\InternalContainer и/или Elgg\Di\PublicContainer.

  3. Добавьте аннотацию @property-read для вашего сервиса вверху. Это позволяет средам разработки и статическим анализаторам кода понимать тип свойства при использовании _elgg_services() или elgg().

  4. Зарегистрируйте ваш сервис в engine\internal_services.php или engine\public_services.php, используя автопривязку или фабрику.

Внедрите ваши зависимости

Elgg использует PHP-DI для регистрации и разрешения сервисов. Зависимости могут быть автопривязаны (на основе типизированных аргументов конструктора сервисы могут быть внедрены) или сервис может быть создан в фабрике.

Примечание

Для получения дополнительной информации о PHP-DI посетите их веб-сайт.

Сделать сервис частью публичного API

Если ваш сервис предназначен для использования разработчиками плагинов:

  1. Создайте интерфейс Elgg\Services\<Name>, содержащий только те методы, которые необходимы в публичном API.

  2. Заставьте ваш класс сервиса реализовать этот интерфейс.

  3. Для методов, которые находятся в интерфейсе, переместите документацию в интерфейс. Вы можете просто использовать {@inheritdoc} в PHPDocs методов конкретного класса.

  4. Задокументируйте ваш сервис в docs/guides/services.rst (этом файле).

  5. Откройте тест PHPUnit Elgg\ApplicationTest и добавьте ключ вашего сервиса в массив $names в методе testServices().

  6. Откройте класс Elgg\Application.

  7. Добавьте объявление @property-read для документирования вашего сервиса, но используйте ваш интерфейс в качестве типа, а не имя класса вашего сервиса.

Теперь ваш сервис будет доступен через доступ к свойству экземпляра Elgg\Application:

// using the public foo service
$three = elgg()->foo->add(1, 2);

Примечание

Примеры см. в сервисе config, включая интерфейс Elgg\Services\Config и конкретную реализацию Elgg\Config.

Жизненный цикл сервисов и фабрики

По умолчанию сервисы, зарегистрированные в провайдере сервисов, являются «общими», что означает, что провайдер сервисов сохранит созданный экземпляр на оставшуюся часть запроса и будет предоставлять тот же экземпляр всем, кто запрашивает свойство.

Если вам нужно, чтобы разработчики могли создавать объекты, предварительно подключённые к сервисам Elgg, вам может потребоваться добавить публичный метод фабрики в Elgg\Application. Вот пример, который возвращает новый экземпляр с использованием внутренних сервисов Elgg:

public function createFoo($bar) {
    $logger = $this->services->logger;
    $db = $this->services->db;
    return new Elgg\Foo($bar, $logger, $db);
}