Реализация паттерна MVC на php

330
08 марта 2017, 20:42

Я набросал небольшой примерчик 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 году&hellip;"
    ],
    [
      "id" => 42,
      "date" => "02.12.2017 2:28",
      "title" => "Васильева вместо математики предложила ввести в учебных заведениях дополнительные часы православия",
      "description" => "Васильева считает 4 часа богословия в неделю недостаточными для формирования духовных скреп.",
      "content" => "Министр образования Ресурсной Федерации Ольга Васильева выступила с этой неожиданной инициативой&hellip;"
    ],
  ];
  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();
READ ALSO
C++. Реализация функции strtok

C++. Реализация функции strtok

Нужна собственная реализация этой функцииНемогу ничего грамотного реализовать

571
Приведение числовых типов через reinterpret_cast

Приведение числовых типов через reinterpret_cast

Если мы используем reinterpret_cast для приведения указателя к указателю, объекта к указателю или указателя к объекту, то приведение осуществляется...

224