Как стать автором
Обновить

Разделение вида и контроллера

Время на прочтение 2 мин
Количество просмотров 912

Что это?


Думаю многие из программистов понимают необходимость разделять контроллеры (или, как еще говорят, бизнес-логику) от вида (или логики отображения). Это упрощает поддержку, редизайн и реализацию скинов. Реализаций этого безобразия существует огромное количество и я хотел бы и свои пять копеек вставить :)
Вы можете найти огромное количество топиков на эту тему, но в основном они касаются «вида», точнее всяческих шаблонизаторов. Я не буду сейчас об этом, иначе это превратится в очередной холивар. Темя этой статьи — контроллер, а точнее моя его реализация, хотя отображения это тоже касается :).
Если где-то есть нечто похожее буду благодарен за указание источников.

Зачем это?


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

Что мы имеем сейчас?


Поскольку страницы очень часто имеют много общего, то часто мы имеем нечто вроди:
{?php include "header.php" ?}
some content
{?php include "footer.php" ?}

или
header
{?php include "{$module}.php" ?}
footer

Недостатки первого подхода очевидны, второй же подход не очень хорош с точки зрения контроллера

Как это?


Идея состоит в использовании объектно-ориентированого подхода (поскольку перегрузки функций в PHP нет)
{?php # main controller

class Main_Cntr {
    function render() {
        # some logic
        include 'main.tpl';
    }
    function content() {
        # some logic
        include 'default_content.tpl';
    }
    function module() {
        # some logic
        include 'default_module.tpl';
    }
};

Теперь в целосном шаблоне main.tpl будут прямые указания:
...header...
{?php $this->content() ?}
...some view...
{?php $this->module() ?}
...footer...

Преимущество подхода состоит в том, что мы можем выстраивать иерархию страниц, порождая потомков:
{?php # main controller

class Other_Cntr extends Main_Cntr {
    function content() {
        # some other logic
        include 'other_content.tpl';
    }
};

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

Заключение


Естественно детали реализации могут быть изменены, тут могут быть использованы любые шаблонизаторы.
  1. Код шаблонов остается абсолютно читабельным и понятным — используется абстрактная разметка логических элементов страницы.
    Код контроллеров так же понятен и прост, упрощается создание однотипных шаблонов и повторяющихся элементов на страницах.

    Буду рад конструктивным замечаниям и комментариям.
    P.S.: Со знаками больше-меньше какие-то глюки, пришлось постить фигурные скобки.
Теги:
Хабы:
-5
Комментарии 18
Комментарии Комментарии 18

Публикации

Истории

Работа

PHP программист
175 вакансий

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн
PG Bootcamp 2024
Дата 16 апреля
Время 09:30 – 21:00
Место
Минск Онлайн
EvaConf 2024
Дата 16 апреля
Время 11:00 – 16:00
Место
Москва Онлайн