контроллер представления модели — Как организовать архитектуру MVC в переполнении стека

Как организовать архитектуру 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;
}
}

-2

Решение

Есть несколько способов сделать это.

Вы можете использовать одноэлементный шаблон проектирования, чтобы один экземпляр класса устанавливал соединение с базой данных, а затем использовал его повторно.

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();
}

Таким образом, код намного проще для тестирования и не зависит от состояния.

-3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]