Как организовать архитектуру MVC в PHP?
Я пытался сделать это, и это работает, но в моей модели кода подключается к базе данных каждый раз, когда он загружается. Возможно ли использовать предыдущее соединение?
Вот мои файлы (не делающие никаких запросов в модели, например):
index.php
include 'controller/home.php';
$home = new HomeController();
$home->index();
Контроллер / home.php
class HomeController {
public function index () {
require('model/home.php');
require('model/another.php');
$home = new HomeModel();
echo $home->foo();
echo $home->bar();
$another = new AnotherModel();
echo $another->baz();
}
}
модель / home.php
class HomeModel extends mysqli {
public function __construct() {
parent::__construct('localhost', 'root', '', 'mydb');
if (mysqli_connect_error()) {
die('Connect Error (' . mysqli_connect_errno() . ') '
. mysqli_connect_error());
}
}
public function foo () {
return true;
}
public function bar () {
return false;
}
}
модель / another.php
class AnotherModel extends mysqli {
public function __construct() {
parent::__construct('localhost', 'root', '', 'mydb');
if (mysqli_connect_error()) {
die('Connect Error (' . mysqli_connect_errno() . ') '
. mysqli_connect_error());
}
}
public function baz () {
return true;
}
}
Есть несколько способов сделать это.
Вы можете использовать одноэлементный шаблон проектирования, чтобы один экземпляр класса устанавливал соединение с базой данных, а затем использовал его повторно.
http://en.wikipedia.org/wiki/Singleton_pattern
Вот пример оболочки вокруг класса PDO, чтобы сделать его синглтоном: http://tonylandis.com/php/php5-pdo-singleton-class/
Вы также можете установить постоянное соединение в PDO (это лучший способ сделать это).
Многие веб-приложения выиграют от создания постоянных соединений с серверами баз данных. Постоянные соединения не закрываются в конце сценария, но кэшируются и используются повторно, когда другой сценарий запрашивает подключение с использованием тех же учетных данных. Постоянный кэш подключений позволяет избежать накладных расходов на установление нового подключения каждый раз, когда сценарию требуется связаться с базой данных, что приводит к более быстрому веб-приложению.
<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(
PDO::ATTR_PERSISTENT => true
));
?>
http://php.net/manual/en/pdo.connections.php
Вы можете установить постоянное соединение с MySQLi, если у вас есть 5.3+: http://php.net/manual/en/mysqli.persistconns.php
Удачи!
Поскольку ответ получил много критики, позвольте мне остановиться подробнее. Да, использование шаблона синглтон-дизайна — не самый элегантный способ работы. Лучший способ справиться с вашими моделями — создать экземпляр MySQLi (или PDO) в контроллере и передать его каждой модели.
class HomeModel {
private $_db;
public function __construct($db) {
$this->_db = $db;
}
public function foo () {
return true;
}
public function bar () {
return false;
}
}
и в вашем контроллере.
public function index () {
require('model/home.php');
require('model/another.php');
$db = new mysqli('localhost', 'root', '', 'mydb');
$home = new HomeModel($db);
echo $home->foo();
echo $home->bar();
$another = new AnotherModel($db);
echo $another->baz();
}
Таким образом, код намного проще для тестирования и не зависит от состояния.
Других решений пока нет …