Mr.KTO blog

Как написать контроллер на PHP

Можно, конечно, прочитать статью о контроллере в Symfony.

Но, думаю что гораздо понятнее будет следующий пример. Он показывает различие обычного подхода и подхода MVC с ООП.

Стандарный:

file1.php

if ($_GET['action'] == "act1") {

    echo "do act1";

} elseif ($_GET['action'] == "act2") {

    echo "do act2 with param1=".$_GET['param1'];

} else {

    echo "e.g. html form here";

}

Как ООП-контроллер:

file2.php

class file2_Controller {

    function file2_Controller()
    {
        switch ($_GET['action']) {
            case "act1":
                return $this->act1();
            case "act2":
                return $this->act2($_GET['param1']);
            default:
                return $this->echo_form();
        }
    }
    function act1()
    {
        echo "do act1";
    }
    function act2($param1)
    {
        echo "do act2 with param1=".$param1;
    }
    function echo_form()
    {
        echo "e.g. html form here";
    }

} new file2_Controller;

В последней строчке после фигурной скобки закрытия класса мы сразу создаём экземпляр этого класса, при этом запуская конструктор (function file2_Controller()), но не присваивая объект переменной.

Как видно, совсем не обязательно пихать всё в один файл index.php с RewriteRule .* index.php без особой на то необходимости.

habrahabr.ru google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru rumarkz.ru memori.ru moemesto.ru moikrug.ru myscoop.ru mister-wong.ru rucity.com vaau.ru

Комментарии (6) на “Как написать контроллер на PHP”

  1. Thorn пишет:

    Вобще всех кто юзает первый вариант на расстрел )

  2. Григорий Ситнин пишет:

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

  3. Григорий Ситнин пишет:

    Поясню. Скорее всего реврайт так и так будет на один и тот же index.php, но для нормального ООП, этот самый index.php должен поднимать фабрику, которая будет создавать имплементор интерфейса, скажем, WebPageProcessor, в котором вызывать метод, скажем WebPageProcessor->process();

    Вот это на мой взгляд нормальное ООП.

  4. Григорий Ситнин пишет:

    Разумеется, я могу чего-то не понимать и вообще не претендую на единственно верный способ =)

  5. Григорий Ситнин пишет:

    Не могу молчать =) Пропустил, когда читал первую строку поста. =)

    Так вот, никаких различий между процедурным стилем и MVC-стилем работы статья не иллюстрирует, так как тут вообще о парадигме MVC нет ни грамма. Вот. Сори. =)

  6. mrkto пишет:

    Система файлов для выполнения определённых действий тоже представляет своего рода контроллер (news.php, account.php). Но в них тоже могут быть различные действия (?login, ?page=10). Здесь просто вместо линейной программы используются методы для каждого действия. Позже напишу о том, что там (в методах/action) должно быть.

    Это просто идея. Я ни фига не чиаю книжек по программированию. И стараюсь ко всему придти сам. Ведь никакая концепция программирования не может быть 100% истиной. Это просто разные способы достижения цели.

Оставить комментарий