Использование Pimple в проекте MVC - PullRequest
0 голосов
/ 08 ноября 2018

Я не хочу вводить контейнер 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 различных мнений о том, как это сделать, и каждый, кажется, отвечает на что-то другое.

...