Сервисы

Введение

Все базовые классы в CodeIgniter предоставляются как «услуги». Это просто означает, что вместо жесткого кодирования имени класса для загрузки классы для вызова определяются в очень простом файле конфигурации. Этот файл действует как своего рода фабрика для создания новых экземпляров требуемого класса.

Быстрый пример, вероятно, прояснит ситуацию, поэтому представьте, что вам нужно получить экземпляр класса Timer. Самый простой способ — просто создать новый экземпляр этого класса:

$timer = new \CodeIgniter\Debug\Timer();

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

Вместо того, чтобы создавать экземпляр самостоятельно, мы позволяем центральному классу создавать для нас экземпляр класса. Этот класс остается очень простым. Он содержит только метод для каждого класса, который мы хотим использовать в качестве службы. Метод обычно возвращает общий экземпляр этого класса, передавая ему любые зависимости, которые он может иметь. Затем мы заменим наш код создания таймера на код, который вызывает этот новый класс:

$timer = \Config\Services::timer();

Когда вам нужно изменить используемую реализацию, вы можете изменить файл конфигурации служб, и это изменение произойдет автоматически во всем приложении, и вам не придется ничего делать. Теперь вам просто нужно воспользоваться любой новой функциональностью, и все готово. Очень просто и устойчиво к ошибкам.

Заметка

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

Функции удобства

Для получения услуги предусмотрены две функции. Эти функции доступны всегда.

Первый service()возвращает новый экземпляр запрошенной службы. Единственный обязательный параметр — это имя службы. Это то же самое, что имя метода в файле Services всегда возвращает SHARED-экземпляр класса, поэтому при многократном вызове функции всегда должен возвращаться один и тот же экземпляр:

$logger = service('logger');

Если для метода создания требуются дополнительные параметры, их можно передать после имени службы:

$renderer = service('renderer', APPPATH.'views/');

Вторая функция single_service()работает точно так же, service()но возвращает новый экземпляр класса:

$logger = single_service('logger');

Определение услуг

Чтобы службы работали хорошо, вы должны полагаться на то, что каждый класс имеет постоянный API или интерфейс для использования. Практически все классы CodeIgniter предоставляют интерфейс, которого придерживаются. Если вы хотите расширить или заменить базовые классы, вам нужно только убедиться, что вы соответствуете требованиям интерфейса и знаете, что классы совместимы.

Например, RouterCollectionкласс реализует RouterCollectionInterface. Если вы хотите создать замену, которая предоставляет другой способ создания маршрутов, вам просто нужно создать новый класс, реализующий RouterCollectionInterface:

class MyRouter implements \CodeIgniter\Router\RouteCollectionInterface
{
        // Implement required methods here.
}

Наконец, измените /app/Config/Services.php, чтобы создать новый экземпляр MyRouter вместо CodeIgniter\Router\RouterCollection:

public static function routes()
{
        return new \App\Router\MyRouter();
}

Допустимые параметры

В некоторых случаях вам может потребоваться возможность передать параметр классу во время создания экземпляра. Поскольку файл служб — это очень простой класс, эту работу легко выполнить.

Хороший пример — rendererсервис. По умолчанию мы хотим, чтобы этот класс мог находить представления в APPPATH.views/. Однако мы хотим, чтобы у разработчика была возможность изменить этот путь, если этого требуют его нужды. Таким образом, класс принимает в $viewPath качестве параметра конструктора. Метод обслуживания выглядит так:

public static function renderer($viewPath=APPPATH.'views/')
{
        return new \CodeIgniter\View\View($viewPath);
}

Это устанавливает путь по умолчанию в методе конструктора, но позволяет легко изменить путь, который он использует:

$renderer = \Config\Services::renderer('/shared/views');

Общие классы

Бывают случаи, когда вам нужно требовать, чтобы был создан только один экземпляр службы. Это легко сделать с помощью getSharedInstance()метода, вызываемого из фабричного метода. Это обрабатывает проверку того, был ли экземпляр создан и сохранен в классе, и, если нет, создает новый. Все фабричные методы предоставляют значение в качестве последнего параметра. Вам также следует придерживаться этого метода:$getShared = true

class Services
{
    public static function routes($getShared = false)
    {
        if (! $getShared)
        {
            return new \CodeIgniter\Router\RouteCollection();
        }

        return static::getSharedInstance('routes');
    }
}

Обнаружение услуг

CodeIgniter может автоматически обнаруживать любые файлы Config \ Services.php, которые вы могли создать в любых определенных пространствах имен. Это позволяет легко использовать любые файлы служб модуля. Чтобы файлы настраиваемых служб могли быть обнаружены, они должны соответствовать следующим требованиям:

  • Его пространство имен должно быть определено в Config\Autoload.php
  • Внутри пространства имен файл должен находиться по адресу Config\Services.php
  • Он должен продлить CodeIgniter\Config\BaseService

Небольшой пример должен прояснить это.

Представьте, что вы создали новый каталог Blogв корневом каталоге. Это будет содержать модуль блога с контроллерами, моделями и т. Д., И вы хотели бы сделать некоторые классы доступными в качестве службы. Первым шагом является создание нового файла: Blog\Config\Services.php. Каркас файла должен быть:

<?php namespace Blog\Config;

use CodeIgniter\Config\BaseService;

class Services extends BaseService
{
    public static function postManager()
    {
        ...
    }
}

Теперь вы можете использовать этот файл, как описано выше. Если вы хотите получить службу сообщений с любого контроллера, вы должны просто использовать Config\Servicesкласс фреймворка для получения своей службы:

$postManager = Config\Services::postManager();

Заметка

Если несколько файлов служб имеют одно и то же имя метода, первый найденный будет возвращенным экземпляром.

Добавить комментарий