Контейнер
Контейнер - это объект, предназначенный для управления зависимостями классов, а также для хранения данных, доступ к которым нужен в любом месте приложения.
Основные методы:
bind()
— регистрация зависимости класса. При каждом обращении к зарегистрированной зависимости будем создаваться указанный класс. Первый параметром указывается псевдоним (алиас) зависимости в контейнере. Вторым параметром можно указать имя класса, экземпляр которого будет создан при обращении к контейнеру, или функцию-замыкание.
// Инициализируем зависимость при инициализации MODX app()->bind('user', function($app, $params = array()) { if (isset($params['id'])) $user = user($params['id']); // Делаем нужные манипуляции и инициализации ... // Возвращаем подготовленный объект пользователя return $user; }); ... // В любом месте приложения вызываем $user = app('user', array('id' => 5)); // получаем этот объект пользователя
singleton()
— привязывает класс или интерфейс к контейнеру, который должен быть создан только один раз. При первом обращении создаёт экземпляр указанного класса. При последующих обращениях метод возвращает этот созданный экземпляр. Синглтоны часто используются в качестве сервисов или менеджеров.// В плагине при инициализации MODX определяем зависимость app()->singleton('userService', function() use ($modx) { return new userService(); // некий класс сервиса пользователей });
instance()
— регистрация уже существующего объекта в качестве синглтона. Данный экземпляр будет всегда возвращаться при последующих обращениях к контейнеру.// Регистрируем объект $modx для доступа к нему из любого места/класса приложения app()->instance('modx', $modx); // Обращаемся к нему $modx = app('modx');
bound()
— проверяет, определена ли указанная зависимость.if (!app()->bound('alias')) { app()->bind('alias', function(){...}); }
isShared()
— проверяет, определена ли указанная зависимость как синглтон.if (app()->isShared('service')) { $service = app(service); }
resolved()
— проверяет, создан ли объект указанной зависимости. Применяется для проверки синглетонов.if (app()->resolved('modx')) { // В контейнере объект $modx существует. $modx = $app('modx'); }