Дополнительно/Специальные возможности/Контейнер и сервисы/Переопределение стандартного сервиса

Переопределение стандартного сервиса

Получение стандартного сервиса из контейнера может быть изменено добавлением в пользовательский контейнер собственного сервиса с аналогичным интерфейсом. Необходимо создать новый сервис и вернуть его из метода 'getSingleton' класса App\Bootstrap\ContainerFactory перед выбором из стандартных сервисов. Во фреймворке HLEB2 используется по два идентичных интерфейса (для разных вариантов именования) для каждого встроенного сервиса, необходимо вернуть собственный сервис как singleton для интерфейса с окончанием 'Interface'. Например, для сервиса кеширования это будет 'Hleb\Reference\CacheInterface'.

<?php
// File /app/Bootstrap/ContainerFactory.php

namespace App\Bootstrap;

use 
Hleb\Constructor\Containers\BaseContainerFactory;
use 
Hleb\Reference\CacheInterface;

final class 
ContainerFactory extends BaseContainerFactory
{
    public static function 
getSingleton(string $id): mixed
    
{
        
self::has($id) or self::$singletons[$id] = match ($id) {
            
// Adding a replacement for a service.
            
CacheInterface::class => new OtherCacheService(),

            
// ... //
            
default => null
        
};
        return 
self::$singletons[$id];
    }

    public static function 
rollback(): void
    
{
        
// ... //
    
}
}

В примере показано, для сервиса кеширования, как изменить стандартный сервис на собственный. Здесь это может быть кеширование с хранилищем в базе данных, а не файловое (по умолчанию).

Таким же образом можно "удалить" стандартный сервис из контейнера, переопределив его NULL значением. Но сначала необходимо убедиться, что сервис не используется ни в коде самого фреймворка, ни в коде приложения.

Страница создана: @fomiash
К началу страницы