Добавление сервиса в Elgg
В руководстве по сервисам содержится общая информация об использовании сервисов Elgg.
Чтобы добавить новый объект сервиса в Elgg:
Пометьте ваш класс как
@internal, если это внутренний сервис.Откройте класс
Elgg\Di\InternalContainerи/илиElgg\Di\PublicContainer.Добавьте аннотацию
@property-readдля вашего сервиса вверху. Это позволяет средам разработки и статическим анализаторам кода понимать тип свойства при использовании_elgg_services()илиelgg().Зарегистрируйте ваш сервис в
engine\internal_services.phpилиengine\public_services.php, используя автопривязку или фабрику.
Внедрите ваши зависимости
Elgg использует PHP-DI для регистрации и разрешения сервисов. Зависимости могут быть автопривязаны (на основе типизированных аргументов конструктора сервисы могут быть внедрены) или сервис может быть создан в фабрике.
Примечание
Для получения дополнительной информации о PHP-DI посетите их веб-сайт.
Сделать сервис частью публичного API
Если ваш сервис предназначен для использования разработчиками плагинов:
Создайте интерфейс
Elgg\Services\<Name>, содержащий только те методы, которые необходимы в публичном API.Заставьте ваш класс сервиса реализовать этот интерфейс.
Для методов, которые находятся в интерфейсе, переместите документацию в интерфейс. Вы можете просто использовать
{@inheritdoc}в PHPDocs методов конкретного класса.Задокументируйте ваш сервис в
docs/guides/services.rst(этом файле).Откройте тест PHPUnit
Elgg\ApplicationTestи добавьте ключ вашего сервиса в массив$namesв методеtestServices().Откройте класс
Elgg\Application.Добавьте объявление
@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);
}