Я набросал небольшой примерчик MVC на php и мне интересно правильно ли я понимаю эту парадигму? Должен ли каждый контроллер иметь один вид и одну модель? Подходит ли модель MVC для веба? Просто тут всего лишь одно событие происходит - это запрос страницы. Я немного программировал на Qt там вообще только вид есть (для некоторых виджетов типа списка и таблицы есть модели). Есть ли какая парадигма более подходящая для веба?
<?php
abstract class BaseModel {}
abstract class BaseView {}
abstract class BaseController {
public function __construct($model, $view) {
$this->model = $model;
$this->view = $view;
}
}
class MainModel extends BaseModel {
private $entries = [
[
"id" => 1,
"date" => "01.12.2017 4:02",
"title" => "Полет на Марс",
"description" => "Американцы полетят на Марс уже в 2022 году.",
"content" => "Американский миллиардер Илон Маск планирует отправить экспедицию на Марс в 2022 году…"
],
[
"id" => 42,
"date" => "02.12.2017 2:28",
"title" => "Васильева вместо математики предложила ввести в учебных заведениях дополнительные часы православия",
"description" => "Васильева считает 4 часа богословия в неделю недостаточными для формирования духовных скреп.",
"content" => "Министр образования Ресурсной Федерации Ольга Васильева выступила с этой неожиданной инициативой…"
],
];
public function getEntries() {
return array_reverse($this->entries);
}
public function getEntryById($id) {
foreach ($this->entries as $entry) {
if ($entry['id'] == $id) {
return $entry;
}
}
return null;
}
}
class MainView extends BaseView {
public function showEntries($entries) {
foreach ($entries as $entry) {
echo "<article>";
echo "<a href='/Main/entries/{$entry['id']}'><h2>{$entry['title']}</h2></a>";
echo "<section><time>{$entry['date']}<time></section>";
echo "<section>{$entry['description']}</section>";
echo "</article>";
}
}
public function showEntry($entry) {
echo "<nav><a href='/'>Back</a></nav>";
echo "<article>";
echo "<h2>{$entry['title']}</h2>";
echo "<section><time>{$entry['date']}<time></section>";
echo "<section>{$entry['content']}</section>";
echo "</article>";
}
}
class MainController extends BaseController {
public function index() {
$entries = $this->model->getEntries();
$this->view->showEntries($entries);
}
public function entries($id) {
$entry = $this->model->getEntryById($id);
$this->view->showEntry($entry);
}
}
class FrontController {
public function __construct() {
//
}
public function dispatch() {
$segments = isset($_GET['_uri']) ? explode('/', $_GET['_uri']) : [];
// var_dump($segments);
$class_prefix = empty($segments[0]) ? 'Main' : $segments[0];
$action = empty($segments[1]) ? 'index' : $segments[1];
$model_class = $class_prefix . 'Model';
$view_class = $class_prefix . 'View';
$controller_class = $class_prefix . 'Controller';
$model = new $model_class();
$view = new $view_class();
$controller = new $controller_class($model, $view);
call_user_func_array([$controller, $action], array_slice($segments, 2));
}
}
$c = new FrontController();
$c->dispatch();
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Нужна собственная реализация этой функцииНемогу ничего грамотного реализовать
Если мы используем reinterpret_cast для приведения указателя к указателю, объекта к указателю или указателя к объекту, то приведение осуществляется...