Pull to refresh

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

Reading time2 min
Views988

Что это?


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

Зачем это?


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

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


Поскольку страницы очень часто имеют много общего, то часто мы имеем нечто вроди:
{?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.: Со знаками больше-меньше какие-то глюки, пришлось постить фигурные скобки.
Tags:
Hubs:
Total votes 17: ↑6 and ↓11-5
Comments18

Articles