Проще говоря, роль контроллера — принимать запросы. Он использует метод get, в данном случае через URI, для загрузки функционального модуля для обновления или отправки уровня представления. Контроллер будет использовать автоматическую глобальную переменную $_GET, чтобы определить, какой модуль загружать.
Пример запроса будет выглядеть так:
http://example.com/index.php?module=login
Это кажется простым, но в процессе реализации это не так. Вот части аргументов, которые могут распознаваться несколькими контроллерами:
модуль определяет, какой модуль использовать, например, пользователи. Класс модуля определяет, какой функциональный класс использовать, например, хотите ли вы, чтобы пользователи входили в систему или выходили из нее.
event определяет, какое конкретное событие использовать.
Более сложный пример может объяснить URL-адрес запроса, который в конечном итоге состоит из каждого приведенного выше аргумента:
http://example.com/index.php?module=users&class=login
Этот запрос сообщает контроллеру, что. он должен загрузить модуль пользователей, затем класс входа в систему и, наконец, запустить событие по умолчанию для входа в систему::__default(), поскольку конкретное событие не определено.
Ниже приводится конкретная часть кода:
<?php
/**
*index.php
*
* @author Джо Стамп < [email protected] >
* @copyright Джо Стамп < [email protected] >
* @license http://www.opensource.org/licenses/gpl-license.php
* @packageFramework
*/
require_once('config.php');
// {{{ __autoload($class)
/**
* __автозагрузка
*
* Автозагрузка запускается PHP, когда он не может найти класс, который пытается загрузить.
* Разумно назвав наши классы, мы сможем загрузить большинство классов.
* динамически.
*
* @author Джо Стамп < [email protected] >
* @param string $class Имя класса, который мы пытаемся загрузить
* @return void
* @packageFramework
*/
функция __autoload($class)
{
$file = str_replace('_','/',substr($class,2)).'.php';
require_once(FR_BASE_PATH.'/includes/'.$file);
}
// }}}
if (isset($_GET['module'])) {
$модуль = $_GET['модуль'];
если (isset($_GET['event'])) {
$event = $_GET['событие'];
} еще {
$event = '__default';
}
if (isset($_GET['class'])) {
$класс = $_GET['класс'];
} еще {
$класс = $модуль;
}
$classFile = FR_BASE_PATH.'/modules/'.$module.'/'.$class.'.php';
если (file_exists($classFile)) {
require_once($classFile);
если (class_exists($class)) {
пытаться {
$экземпляр = новый $класс();
if (!FR_Module::isValid($instance)) {
die("Запрошенный модуль не является допустимым модулем фреймворка!");
}
$экземпляр->имя_модуля = $модуль;
если ($instance->authenticate()) {
пытаться {
$result = $instance->$event();
if (!PEAR::isError($result)) {
$presenter = FR_Presenter::factory($instance->presenter,$instance);
if (!PEAR::isError($presenter)) {
$презентер->дисплей();
} еще {
die($presenter->getMessage());
}
}
} catch (Исключение $error) {
die($error->getMessage());
}
} еще {
die("У вас нет доступа к запрошенной странице!");
}
} catch (Исключение $error) {
die($error->getMessage());
}
} еще {
die("Действительный модуль для вашего запроса не найден");
}
} еще {
die("Не удалось найти: $classFile");
}
} еще {
die("Не указан допустимый модуль");
}
?>
Ниже приведены конкретные комментарии к приведенному выше коду:
загрузите «config.php»,
чтобы определить функцию __autoload(). Это новая функция PHP5, которая облегчает динамическую загрузку различных классов.
Если аргумент определен, то загружаются соответствующие модули, классы и конкретные события,
после чего следуют некоторые оценки и конкретные операции с ошибками.
Наконец, после того,
как все правильно, загружается уровень представления
[дружественный URL-адрес]
.В приведенном выше примере упоминается: «Если вам это неудобно, используйте mod_rewrite для реализации дружественных URL-адресов». Далее следует фактический стандартный код переписывания, написанный автором для этой среды:
RewriteEngine On
# Измените здесь URI на то, что вы хотите, чтобы ваша домашняя страница была
RewriteRule ^/$ /index.php?module=welcome [L,QSA]
# Изменения / index.php?module=добро пожаловать в /welcome
RewriteCond %{DOCUMENT_ROOT}/
%{REQUEST_FILENAME} !-d RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteRule ^/([^/]*)$ /index. php?module=$1 [L,QSA]
# Изменяет /index.php?module=users&class=login на /users/login
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteRule ^/([^/]*)/([^/]*)$ /index.php?module=$1&class=$2 [L,QSA]
# Изменения /index.php?module=users&class=login&event =foo
# to /users/login/foo.html
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
RewriteRule ^/([^/]*)/( [^/]*)/([^/]*).html$
/index.php?module=$1&class=$2&event=$3 [L,QSA]
Расширение контроллера
[Расширенный контроллер]
имеет централизованный контроллер. Один из Плюсы в том, что после добавления некоторых функций их можно сразу отразить через контроллер. Вот несколько идей по расширению этого контроллера, чтобы сделать платформу в целом более мощной:
Вы можете использовать SoapServer, новую функцию PHP5, для автоматического определения того, является ли запрос SOAP.
Вы можете использовать контроллеры для
предотвращения вредоносного кода HTML.
Преобразуя выражения на лету, например, из режима по умолчанию в режим PDF
, вы можете напрямую добавить механизм кэширования в контроллер. Преимущество этого заключается в том, что все приложение может использовать кеш для повышения эффективности
. Следует отметить, что вы находитесь в контроллере. Добавленная функциональность будет отражена во всей программе. Например, вы хотите отфильтровать все автоматические глобальные переменные, но многим администраторам приложений приходится использовать некоторый HTML-код, что становится непростой задачей (Примечание переводчика: Моя идея состоит в том, чтобы добавить условный оператор if для загрузки определенного модуля без применения фильтрации). функция).