Теперь я начинаю понимать шаблон «Модель-Представление-Контроллер», за исключением одной вещи, которая, как мне кажется, застряла, — модель «Модель».
Теперь я успешно выполнил работу Controller и View, просто направив запрос, собрав параметры и проанализировав их с соответствующим контроллером, который расширяет основные функции и генерирует представление.
Сейчас я не знаю, как заставить модель работать. Насколько я знаю, Model — это просто структура данных, поэтому здесь у меня есть файл Article.php, который является моделью для контента блога.
article.php
<?php
class Article extends Database {
public $id;
public $topic;
public $content;
}
?>
Этот класс расширяет класс Database, как показано здесь
database.php
<?php
class Database {
// Current connection which only one connection is allowed in this version
protected $connection;
// MySql Setting Array
protected $dbsettings = array();
public function __construct() {
require_once 'bin/config/db.php';
foreach($db_setting_array as $k => $v) {
$this->dbsettings[$k] = $v;
}
$this->connection = new mysqli(
$this->dbsettings['server'],
$this->dbsettings['username'],
$this->dbsettings['password'],
$this->dbsettings['database']
);
}
public function inject($qr) {
$result = $this->connection->query($qr);
}
public function call($qr) {
$result = $this->connection->query($qr);
return $result;
}
}
?>
и класс Article загружается методом buildData из blog.php с классом Blog, расширяющим основной контроллер
blog.php
<?php
class blog extends Controller {
protected $article;
public function __construct() {
/* Load data structure of Entry.php */
$this->article = $this->BuildData('Entry');
}
public function all($linkname='LINK BACK HOME') {
$this->loadtemplate('blog/blog', array('linkname'=>$linkname));
}
public function each($blogid = '') {
// Query the database here
$result = $this->article->call('select * from articles where id='.$blogid);
while($rows = $result->fetch_assoc()) {
$data['id'] = $rows['id'];
$data['title'] = $rows['title'];
$data['content'] = $rows['content'];
}
$this->loadtemplate('blog/each', $data);
$query = 'insert into articles(title, content) values (\'test2\', \'test2\')';
$this->article->inject($query);
}
};
?>
Вы можете видеть, что внутри Database.php я объявил два метода — inject и call, которые используются для запроса к базе данных, и я использую это в Blog.php, который расширяет основной контроллер.
Со всеми этими кодами мне не нужно ничего делать с моделью. Я могу просто использовать методы «inject» и «call», которые я объявил, для запроса базы данных и анализа массива результата в представлении, как показано в Blog.php.
Итак, как на самом деле работает модель, и если я хочу ее использовать? Или как его обновить на контроллере или внутри самого класса Model?
Предполагается, что Модель взаимодействует с классом Database, поскольку в модели MVC Model отвечает за выборку данных, их обработку и передачу в представление. В вашем случае класс блога (который происходит от контроллера), который не следует модели MVC. Вместо этого ему следует создать экземпляр класса «article» и передать элемент управления классу «article» для извлечения данных из базы данных.
Вы article.php
должен выглядеть так
<?php
class Article extends Database {
public $id;
public $topic;
public $content;
public $database; //Dependency injection
//This method has been moved from the blog class
public function each(&$data, $blogid = '') {
// Query the database here
$result = $this->database->call('select * from articles where id='.$blogid);
while($rows = $result->fetch_assoc()) {
$data['id'] = $rows['id'];
$data['title'] = $rows['title'];
$data['content'] = $rows['content'];
}
}
public function inject() {
$query = 'insert into articles(title, content) values (\'test2\', \'test2\')';
$this->database->inject($query);
}
}
?>
и blog.php
должно быть
<?php
class Blog extends Controller {
protected $article;
public function __construct() {
/* Load data structure of Entry.php */
$this->article = $this->BuildData('Entry');
}
public function all($linkname='LINK BACK HOME') {
$this->loadtemplate('blog/blog', array('linkname'=>$linkname));
}
public function getData($blogid = '') {
$data = array();
$this->article->each($data, $blogid);
$this->loadtemplate('blog/each', $data);
$this->article->inject();
}
}
?>
Несколько вещей, чтобы заметить:
Других решений пока нет …