Продолжаю изучать язык программирования 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 и созданием сайтов — подписывайтесь, и комментируйте материал. Будем учитсья вместе.
Если Вы специалист и случайно наткнулись на мою статью, пожалуйста укажите на ошибки, скажите где копать.