Какова роль модели в MVC и как заставить ее работать?

Теперь я начинаю понимать шаблон «Модель-Представление-Контроллер», за исключением одной вещи, которая, как мне кажется, застряла, — модель «Модель».

Теперь я успешно выполнил работу 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?

0

Решение

Предполагается, что Модель взаимодействует с классом 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();
}
}
?>

Несколько вещей, чтобы заметить:

  1. Модель взаимодействует только с данными. В будущем, если вы измените хранилище данных (перейдите в облако из базы данных), вам нужно будет изменить только модель.
  2. Контроллер имеет всю бизнес-логику для построения представления на основе данных. Когда ваше приложение усложняется, контроллер изменится. Этот принцип проектирования называется «разделение интересов», когда контроллер и модель теперь отвечают за совершенно разные функции.
0

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

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

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