Продолжаю изучать язык программирования 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.
Конечно с бекэндом этого модуля ещё не закончено. Например я пока никак не учёл что делать если нет запрашиваемой страницы. И не предусмотрел возможность загрузки разных ипов страниц — стандартных и лендингов. До этого дойду завтра или через день.

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