butteff
@butteff
Раз в тысячу лет заправляю свитер в носки

Как сделать простенькую MVC модель в php?

Решил сделать для обучения простенькую MVC модель.
на главной создаю объект:

if (isset($_GET['route'])) {
    $action = $_GET['route'];
     new $action;
}


у меня есть функция __autoload, которая подключает нужный файл для класса, вот что в файле hello.class.php:

class hello {
    public $hello = 'hello!!!!!';

    public function __construct() {
        echo $this->hello;
    }
}


Т.е. при обращении по url: site.localhost/hello я вижу hello!!!! на экране.
(ну в htaccess я прописал нужную конструкцию и hello идет как get route поэтому всё работает). Всё, как я хотел, ок!

Теперь, как прикрутить к этому вьюхи? У меня в голове есть много идей, но кажутся все они говнокодом. Например создать переменную $text и вывести ее в шаблоне - вроде все верно, но где она должна быть определена? В экшене? Для каждой страницы она может быть разной, нужно делать отдельный класс-обработчик значений для страницы? И как тогда передавать его во вьюху? И тот файл hello.class.php получается модель, раз он берет данные и отдает их? А что тогда контроллер, его нет? Вот я и поплыл в этих терминах.

В гугле инфы по теме много, но примеров мало и все они, на мой взгляд, не идеальны. Вот например видео, на деле там отделены просто вьюхи от логики и все, но концепции MVC я не вижу, шаблон отдельно, все остальное в куче.

Есть примеры, где вроде как прослеживаются связи модель-контроллер, но на деле получается всё запутанным, можно было бы сделать как-то проще, код выглядит нагруженным, разобраться сложно и не читаемо вовсе, приходится в ИДЕ искать взаимосвязи и разбираться в устройстве кода с дебагером, что не выглядит простой и идеальной моделью.

И вот я прошу помощи. Подскажите простой пример, понятный. Либо помогите мне дописать мой код, но так, чтобы всё было как-то просто и изящно. Поймите меня правильно, отделить все это от вьюхи и передать во вьюху я могу, я не могу познать дзен и сделать это иделаьно, красиво и правильно, да и примеров подобных не найду.

Разумеется, два кусочка кода - это не все, что я написал, просто это отображает логику и понятна суть. Не считаю нужным тянуть сюда конфиг, к примеру, или то, как я прописал функцию __autoload или .htaccess и т.п.

В общем, не знаю понятен ли вопрос, но суть такая:
я хочу сделать простую mvc логику, но не создать говнокод.
я ищу хороший пример идеальной и простой ненагруженной модели mvc в php, но не могу найти. Что-то уровня "hello, MVC world!"
  • Вопрос задан
  • 10863 просмотра
Решения вопроса 2
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Итак, займемся переводом для начала

на главной создаю объект:

В точке входа/во фронт контроллере. Объект этот завется маршрутизатор или раутер. Имеет отношение к MVC - нет.

вот что в файле hello.class.php:

Такое именование файлов и классов было модным во времена php4. Отройте для себя PSR0 (и еще отдельно про PSR-4 можете почитать).

Т.е. при обращении по url: site.localhost/hello я вижу hello!!!! на экране.

Поздравляю вас с первым контроллером... хоть и убогим слегка. Читаем про контроллеры в контексте GRASP

ну в htaccess я прописал нужную конструкцию

Верни мне мой 2007-ой, когда все было круто и все хвастались своими ЧПУ на модреврайтах. Подумайте в сторону единой точки входа и перенаправления всех запросов, для которых не нашлось файлов на эту точку входа. Но это так... просто... совет. Это упростит жизнь при миграции скажем на nginx или черокки какой.

Вот я и поплыл в этих терминах.

Заходим на википедию и выплываем.

Model-view-controller - схема использования нескольких шаблонов проектирования, с помощью которых модель данных приложения, пользовательский интерфейс и взаимодействие с пользователем разделены на три отдельных компонента таким образом, чтобы модификация одного из компонентов оказывала минимальное воздействие на остальные.


Советую почитать полную статью и пройтись по ссылкам. Особенно по части модели данных. Это должно прояснить для вас такой момент что модель это модель данных. То есть у вас есть данные, например блог-пост, есть его модель (просто класс Post который имеет поля id, title, body и т.д.). Проще говоря модель это представления данных в приложении. А view - это слой который занимается тем что переводит данные из формата модели в формат запрашиваемый пользователем. Причем вам не запрещается работать из контроллера с базой. Ну то есть как, есть такие вещи как сервисный слой и тонкие контроллеры, но мы же пока только учимся да?). В любом случае модель не должна знать ничего о том где и как она хранится.

Теперь по поводу view. Давайте вспомним что такое запрос в контексте WEB-приложений. Это старый добрый HTTP запрос. У запроса есть заголовок - Accept который говорит что хочет получить пользователь (пользователи могут быть не живыми и хотеть что-то другое, например JSON). Через него браузер говорит что хочет получить. Например он говорит "хочу text/html" и мы должны выполнить следующие стэпы:
- вызвать контроллер
- контроллер достает из закрамов модельки которые хочет пользователь и отдает их во view.
- view переводит данные из формата приложения в формат который хочет увидеть пользователь.

В очень грубой форме view может быть таким:
PostView {
    
    private $post;    

    public function __construct(Post $post) {
        $this->post = $post;
    }

    public function renderTitle() {
         return sprintf("<h1>%s</h1>", $this->post->getTitle());
    }
    // и еще пара методов    
    public function render() {
         $this->renderTitle();
         $this->renderBody();
    }
}


И по одному таком классу на каждую модель и в каждом классе придется реализовывать сложную логику по формированию вьюшек для наших моделей. Согласитесь, это не удобно. Потому придумали фигачить все в шаблонах и разруливать это движками для шаблонизации (да, одна единственная функция render которая просто инклудит php файл это тоже движек шаблонов).

Практическое задание:
Если все что делает контроллер это отдает отрендренный шаблон без какой либо переменной в нем.... Это MVC? Где тут модель?
Ответ написан
Sanasol
@Sanasol Куратор тега PHP
нельзя просто так взять и загуглить ошибку
сделай класс который отвечает за обработку шаблонов
в контроллере делай вызов $template->render('название шаблон', array(переменные передаваемые в шаблон))

Вот типо того, с использованием твига
<?php
class Template
{
    private function output()
    {
        echo $this->template->render($this->vars);
    }

    public function render($tmpl, $vars = array())
    {
        global $twig;
        $this->vars = $vars;
        $this->tmpl = $tmpl;

        $this->template = $twig->loadTemplate($this->tmpl.'.html');
        $this->output();
    }
}
?>
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
KorP
@KorP
Кратко о себе
Мне в своё время вот эта статья понравилась
habrahabr.ru/post/150267
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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