Может ли такой php код считается сделанным по паттерну MVC?

Логика системы такая.
1) Есть index.php. Этот файл возвращает в браузер разметку (картинки, формы, ссылки и другой HTML). (View)
2) Все действия с этой страницы обрабатываются файлом actions.php. (Controller)
3) Файл actions.php, для обработки действий, использует файл functions.php. (Model)

Пример
1) index.php генерирует разметку с "ссылками" на actions, например
<a href="https://site.com/actions/php?add_user">Создать пользователя</a>

При нажатии на эту ссылку происходит переход на файл actions.php или ajax запрос с данными.

2) Файл actions.php, при переходе на него выполняет указанное действие.
include __DIR__.'/common/functions.php'); 

// Действие - создать пользователя
if (isset($_GET['add_user']))
{

// Вот такая вот логика действия 
// Вызываем функцию user_exist из functions.php
$exist=user_exist();

if ($exist==1)
{
// Вызываем функцию delete_user из functions.php
delete_user();
// Вызываем функцию add_user из functions.php
add_user();
// Возвращаем пользователя назад, на  index.php
header('Location:index.php?&message=user_exist');
exit;
}

// Аналогично, вызываем функции из functions.php
if ($exist==0)
{
add_user();
header('Location:index.php?&message=user_created');
exit;
}

}


3) Ну а в файле functions.php хранятся все функции (или методы и т.д.).

// Соединение с БД (неважно кто как и где вызывает - просто пример)
function connect_to base($hostname, $username, $password, $basename)
{
mysql_connect($hostname, $username, $password) or die (mysql_error());
mysql_select_db($basename) or die (mysql_error());
mysql_query("set character_set_client	='utf8'");
mysql_query("set character_set_results	='utf8'");
mysql_query("set collation_connection	='utf8_general_ci'");
}


function add_user($someval)
{
connect_to base();
mysql_query("INSERT INTO `users`  (`surname`,`name``) VALUES ('$surname','$name')");
do_some_action();
}


function delete_user($someval)
{
// Код
}


В общем, грубо говоря, со странички index.php от пользователя приходит действие/инфа.
Всё это передается actions.php, файл который решает, какие функции из файла functions.php и в каком порядке следует вызвать для выполнения этого действия (действие может быть сложным).
А файл functions.php содержит все функции-"кирпичики", комбинируя которые можно выполнять любые действия.

Может ли такой php код считается сделанным по паттерну MVC?

Ну и также не совсем понятно как, с точки зрения разработки, использовать MVC в качестве паттерна с другими паттернами?
Когда мы говорим о паттернах, мы чаще всего говорим о GOF - банда четырех и их 26 паттернах (одиночка, фабрика и т.д.)
А вот концепция MVC была описана Трюгве Реенскаугом в Xerox PARC.
То есть мы пишем наши системы по 2м паттернам? Фабрика и MVC например?
  • Вопрос задан
  • 259 просмотров
Пригласить эксперта
Ответы на вопрос 3
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
Нет, с MVC эта поделка в стиле конца прошлого века не имеет ничего общего.

"index.php, который возвращает в браузер разметку (картинки, формы, ссылки и другой HTML)" не имеет ничего общего с View. В клиент-серверной архитектуре в принципе невозможно реализовать десктопный извод MVC (ну кроме разве что SPA, но здесь явно не этот случай).
В данном случае вообще непонятно, как это работает, поскольку в любом веб-приложении "инфа приходит" не только, и не столько от пользователя, сколько наоборот - с сервера.
Вам не приходило в голову, что будет ваша система, если она должна будет по команде отобразить список юзеров? А откуда "view" возьмёт его?

"Всё это передается actions.php, файл который решает, какие функции из файла functions.php" - это винегрет из роутера, контроллеров и модели.
"(действие может быть сложным)" означает, что у вас классический "толстый контроллер". В то время как по определению все сложные действия делаются в модели, а контороллер их только вызывает.

Классический вариант клиент-серверного MVC:

Модель - вся бизнес-логика приложения. Это означает, что приложение должно уметь полностью выполнять свои функции с помощью одной только модели (на уровне вызова РНР кода и возврата структур данных в РНР). То есть возвращать список пользователей, удалять и добавлять пользователей и так далее. Выполнять все "действия, которые могут быть сложными".

Контроллер - тонкий интерфейс между моделью и браузером. Понимать НТТР запросы, принимать данные, приводить их в понятный модели вид и отправлять в модель. Возвращать нужные НТТР коды.
При необходимости что-то вывести - вызывает view и передаёт туда данные, полученные от модели.

Вью - рендерит полученные данные в зависимости от желаемого формата, обычно - HTML

Необязательный роутер - при наличии единой точки входа раскидывает апросы по контроллерам.

Реализация MVC на классическом РНР спагетти-стайл:

Модель - может быть набор функций, как здесь. Но все "сложные действия", которые складываются "из кирпичиков" тоже должны быть в модели.

Контроллер - РНР файл, который принимает запрос, например на отображение списка пользователей, вызывает нужную функцию из модели, и отправляет результат в браузер. Это может быть либо НТТР код, или HTML или JSON. В случае с HTML вызывает примитивный шаблонизатор, передавая в него массив с данными и имя файла - шаблона

Вью - тупо HTML файл с вставками РНР. Делится на две части, общий шаблон сайта и шаблон конкретной страницы/действия.
Ответ написан
@ALonUa
Мне кажется, тут надо разбить все на классы для удобства, а то тут у вас каша. Например, подключение к БД можете реализовать как синглтон, а модели, если вы будете следовать паттерну ActiveRecords брать как записи в таблице БД. То есть абстрактный класс модель и есть конкретный класс user, который расширяет модель. У модели user есть статические методы user::store(), user::get() и т.д. Для View можете применить паттерн фасад, то есть он дает понятный интерфейс управления несколькими классами. Кроме того, надо было бы еще вам роуты добавить и лучше внести в отдельный класс, а каждый роут будет являться экземпляром класса роуты. Лучше всего, MVC понятен при использовании фреймворков, попробуйте Laravel. То что я написал не претендует на абсолютную истинность и был написан от человека с уровнем джуна, так что ставьте под сомнение, мою писанину.
Ответ написан
@AlexSer
нет) У тебя просто единая точка входа!
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы