Как написать контроллер на 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 без особой на то необходимости.

ноября 23, 2007 в 03:27
Вобще всех кто юзает первый вариант на расстрел )
ноября 23, 2007 в 18:06
Прости, но я почему-то не понимаю, к чему это твоё заявление про rewrite? У тебя ведь оба варианта совершенно равнозначны и оба как раз будут вызываться из одного реврайта на этот самый один и тот же php.
ноября 23, 2007 в 18:07
Поясню. Скорее всего реврайт так и так будет на один и тот же index.php, но для нормального ООП, этот самый index.php должен поднимать фабрику, которая будет создавать имплементор интерфейса, скажем, WebPageProcessor, в котором вызывать метод, скажем WebPageProcessor->process();
Вот это на мой взгляд нормальное ООП.
ноября 23, 2007 в 18:09
Разумеется, я могу чего-то не понимать и вообще не претендую на единственно верный способ =)
ноября 23, 2007 в 18:11
Не могу молчать =) Пропустил, когда читал первую строку поста. =)
Так вот, никаких различий между процедурным стилем и MVC-стилем работы статья не иллюстрирует, так как тут вообще о парадигме MVC нет ни грамма. Вот. Сори. =)
ноября 23, 2007 в 21:05
Система файлов для выполнения определённых действий тоже представляет своего рода контроллер (news.php, account.php). Но в них тоже могут быть различные действия (?login, ?page=10). Здесь просто вместо линейной программы используются методы для каждого действия. Позже напишу о том, что там (в методах/action) должно быть.
Это просто идея. Я ни фига не чиаю книжек по программированию. И стараюсь ко всему придти сам. Ведь никакая концепция программирования не может быть 100% истиной. Это просто разные способы достижения цели.