Я не хочу вводить контейнер Pimple в каждую отдельную модель и вызов контроллера. Я немного запутался в том, как сделать это без использования одноэлементного шаблона или перекрестных зависимостей.
Например, все мои модели будут расширять базовый класс Model
. Этот класс Model
будет иметь логику взаимодействия с базой данных, поэтому ему нужно будет использовать службу db
, которая является существующим соединением PDO.
Та же логика должна применяться к моей user
службе, которая представляет текущего пользователя приложения. Этот сервис user
должен быть доступен во всех моделях и контроллерах без необходимости вставлять контейнер в каждый отдельный конструктор. Опять же, сервис user
будет создаваться только один раз за запрос.
Рассмотрим мой файл начальной загрузки (public / index.php):
<?php
// load composer
include '../vendor/autoload.php';
// load config definitions
define('db_host', 'localhost');
define('db_port', 3306);
define('db_name', 'rapid');
define('db_username', 'root');
define('db_password', null);
// load container services
$app = new Pimple\Container();
$app['db'] = function () {
return new PDO('mysql:host=' . db_host . ';port=' . db_port . ';dbname=' . db_name, db_username, db_password);
};
$app['user'] = function ($c) {
return new App\Models\User($app);
};
// auto-route based on url
new Kjdion84\Rapid\Router($app);
?>
Вы уже можете видеть, что я делаю то, чего не хочу. Я передаю контейнер в конструкторе User
. Я не хочу передавать контейнер в конструктор любой вызываемой модели. Модель User
расширяет класс Model
, который должен использовать службу db
, но, как я уже сказал, я не хочу делать перекрестную инъекцию контейнера.
Далее, мой Router
просто вызывает соответствующий контроллер / метод на основе текущего URL («автоматическая маршрутизация», если хотите). Я хотел бы, чтобы все службы были доступны для любого контроллера, опять же, без передачи контейнера в качестве параметра в их конструкторы.
Может ли кто-нибудь указать мне правильное направление здесь? Я думаю, что прочитал около 1000 различных мнений о том, как это сделать, и каждый, кажется, отвечает на что-то другое.