Найти в Дзене

MVC — Попытка реализации

Продолжаю изучать язык программирования PHP и писать свой учеблный проект.

Правильно или нет я понял паттерн проектирования MVC, но сегодня я попытался реализовать. Для начала я взял самую на мой взгляд лёгкую часть своего проекта — модуль сайт.
для этого я создал три абстрактных класса
AppController
AppModel
AppView

Также в папке /app/pages/ я создал три класса
PagesController
PagesModel
PagesView
Все они наследуются от таких же абстрактных классов.

Приведу пример абстрактного класса AppController

<?php

abstract class AppController
{
public $route;
abstract protected function startApp();
protected function isGet()
{
if($_SERVER['REQUEST_METHOD'] === 'GET') {
return true;
}
return false;
}
protected function isPost()
{
if($_SERVER['REQUEST_METHOD'] === 'POST') {
return true;
}
return false;
}
protected function getArrayPost()
{
foreach($_POST as $key=>$value) {
$data[$key] = DataCleaner::cleanString($value);
}
return $data;
}

protected function getAppRoute()
{
$url = new \UrlParse;

if($this->route != '/') {
return $url->getNextUrlPath($this->route);
}
return $url->getByNumUrlPath(1);
}

}

Он пока довольно прост.
Метод
startApp() пустой, ибо он абстрактный, я пока не слишком сильно дружу с наследованием и тем более абстракцией, но пока что понимаю это так:
Абстрактные классы нуждны для того, чтобы создать некую архитектуру приложения. Здесь можно задать методы которые будут доступны всем потомкам — обычным классам. И можно задать вот такие пустые методы которые обязательно должны появляться во всех классах потомках, но уже с некой логикой. Интрестно правильно ли я понял тему?

Класс AppModel тоже прост

<?php

abstract class AppModel
{
abstract public function getData();
}

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

Последний на сегдня абстрактный класс это AppView.

<?php

abstract class AppView
{
public $indexTemplate = './core/templates/_index.php';
public $headerTemplate = './core/templates/_header.php';
public $footerTemplate = './core/templates/_footer.php';
public $loadTemplate;

abstract public function getTemplate($data);
}

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

<?php

namespace pages;

class PagesView extends \AppView
{
public function getTemplate($data)
{
$this->loadTemplate = './app/pages/templates/page.php';
include ($this->indexTemplate);
}
}

Просто загружает необходимый шаблон и передаёт туда же данные, дальше во фронтенде уже можно всё это красиво раскладывать по полочкам. а пока в шаблоне page.php только var_damp($data)

Класс PagesModel.

<?php

namespace pages;

class PagesModel extends \AppModel
{
public $page;

public function getData()
{
$db = new \DatabaseMysql;
$data = $db->select('SELECT * FROM pages WHERE page_url = ?', [$this->page]);
return $data;
}
}

Просто запрашивает данные о странице из базы данных и возвращает массив $data.

Класс PagesController

<?php

namespace pages;

class PagesController extends \AppController
{
public $model;
public $view;

public function __construct()
{
$this->model = new PagesModel;
$this->view = new PagesView;
}

public function startApp()
{
$this->model->page = $this->getAppRoute();

if ($this->getAppRoute() === '') {
$this->model->page = 'home';
}

$this->view->getTemplate($this->model->getData());
}

}

как и положено отдаёт команду модели запросить данные о нужной странице в базе и передаёт их представлению.

Таким образом Модуль сайт у меня получился исходя из моего понимания паттерна MVC.
Конечно с бекэндом этого модуля ещё не закончено. Например я пока никак не учёл что делать если нет запрашиваемой страницы. И не предусмотрел возможность загрузки разных ипов страниц — стандартных и лендингов. До этого дойду завтра или через день.

На сегодня всё, продолжение следует…

Если понравилась статья, поставьте, пожалуйста, лайк!

Если Вы интересуетесь программированием на PHP и созданием сайтов — подписывайтесь, и комментируйте материал. Будем учитсья вместе.

Если Вы специалист и случайно наткнулись на мою статью, пожалуйста укажите на ошибки, скажите где копать.