Это моя проблема, у меня есть крошечная PHP MVC-инфраструктура, которую я построил.Теперь, когда я в контроллере, я должен быть в состоянии загрузить модель.У меня есть Модели, названные как таблицы базы данных, такие как Users.php, Pages.php и т. Д.
Все контроллеры расширяют BaseController, а все Модели расширяют BaseModel, так что я могу иметь некоторые методы, доступные для всех контроллеров.Как и в любом контроллере, я могу использовать метод loadModel следующим образом:
$usersModel = $this->loadModel("Users");
Теперь $ usersModel будет объектом, представляющим таблицу базы данных пользователей, и оттуда я должен открыть соединение с базой данных, а также получить, обновить, удалить данные изТаблица пользователей.
Чтобы получить соединение с базой данных из моих Моделей, baseModel имеет метод loadDatabase (), и я использую его так:
$database = $this->loadDatabase();
Это вернет класс, который является тонким слоем вокруг PDO, такоттуда я могу использовать что-то вроде этого:
$data = $database->fetchAssoc("SELECT * FROM users WHERE name = ?", array("someone"));
Вот так я бы вернул некоторые данные из $ Model из контроллера в контроллер.
Итак, по сути, контроллер может загрузить модель, а затемвызовите методы для этой модели, которые возвращали бы некоторые данные или обновляли или удаляли и т. д.
Теперь контроллер может загрузить более одной модели.И каждая модель должна загружать базу данных, и тут все становится сложнее.Мне нужно только одно соединение с базой данных.
Так выглядит метод loadDatabase:
public function loadDatabase()
{
// Get database configuration
require_once("Application/Config/Database.php");
// Build configuration the way Database Object expects it
$dns = "{$db_config['db_driver']}:host={$db_config['db_host']};dbname={$db_config['db_name']}";
$username = $db_config['db_user'];
$password = $db_config['db_pass'];
$options = $db_config['db_options'];
// Return new Database object
return new \Core\Database\Database($dns, $username, $password, $options);
}
Поэтому, прежде чем загрузить объект базы данных, я должен загрузить конфигурацию для соединения с базой данных, как объекты базы данных.__конструктор ожидает этого.Затем я создаю новый объект базы данных и возвращаю его.
Теперь я застрял и не знаю, является ли это правильным способом загрузки базы данных из модели?Как мне это настроить, как мне загрузить базу данных изнутри модели, чтобы всегда был только один экземпляр объекта базы данных.Из-за того, что я делаю что-то подобное из Controller:
$users = $this->loadModel("Users");
$pages = $this->loadModel("Pages");
$users->doSomethingThatNeedsDatabase();
$users->doSomethingThatNeedsDatabase();
$pages->doSomethingThatNeedsDatabase();
Я бы создал 3 объекта базы данных: (
Поэтому мой вопрос: как мне загрузить базу данных изнутри моделей и какдолжен ли этот метод выглядеть в BaseModel? Что если я хотел бы использовать 2 базы данных, у меня возникнут большие проблемы с этой настройкой. Как я могу добиться этого, не используя шаблон синглтона?
На данный момент у меня также естьчто-то вроде этого:
public function getDatabase()
{
$reg = \Core\Registry\Registry::getInstance();
$db = $reg->getObject("database");
if(!isset($db))
{
require_once("Application/Config/Database.php");
$dns = "{$db_config['db_driver']}:host={$db_config['db_host']};dbname={$db_config['db_name']}";
$username = $db_config['db_user'];
$password = $db_config['db_pass'];
$options = $db_config['db_options'];
$db = new \Core\Database\Database($dns, $username, $password, $options);
$reg->setObject('database', $db);
}
return $reg->getObject('database');
}
Это шаблон реестра, в котором я могу хранить общие объекты. Поэтому, когда Модель запрашивает подключение к БД, я могу проверить, находится ли класс БД в реестре, и вернуть его, если нетinstaciate, а затем вернуть ... Самое странное, что мне нужно загрузить конфигурационный массив ...
Так каков наилучший способ загрузки базы данных из моделей?
Спасибо за чтениеэто был очень длинный вопрос, но это меня так сильно беспокоит, я надеюсь, что кто-то может помочь мне с этим ... Спасибо!