Контроллер – это обычный файл с классом. Название файла – произвольное (только латинскими буквами). Желательно, чтобы оно ассоциировалось с URI, по которому будет вызван контроллер.
Например, можно назвать файл topics.php и положить в каталог ext/module_name/controllers/. Этот файл можно будет вызвать по адресу http://site.com/module_name/topics. Когда имя контроллера будет найдено в одном из сегментов URI, он будет загружен.
Создание экземпляра контроллера. В момент вызова контроллера создается экземпляр класса, унаследованного от класса common_controller (http://site.com/ext/common/controller.php).
Имена классов контроллеров должны быть в нижнем регистре и следовать общему правилу – "модуль_ controllers_название файла контроллера". Например:
class forum_controllers_topics extends common_controller { //… }
Здесь forum – модуль, topics – название файла контролера.
Действие. При запуске контроллер выполняет соответствующее действие, которое получает данные от модели и отображает необходимое представление. Действие – это обычная php-функция, метод класса контроллера, название которого тоже должно ассоциироваться с URI, по которому оно будет вызвано.
Действие по умолчанию. По умолчанию, во всех пользовательских контроллерах используется действие index:
class forum_controllers_topics extends common_controller { public function index() { //… } }
В адресе страницы, которая работает с действием по умолчанию, слово index не пишется, например, приведенный выше код будет работать по адресу: http://site.com/forum/topics.
Пример создания контроллера и действия. Следующий код определит контролер topics (в модуле forum) с действиями index и addpost:
class forum_controllers_topics extends common_controller { public function index() { print 'Hello World!'; } public function addpost () { print 'Add post!'; } }
Вставьте этот код в файл topics.php и сохраните файл в каталоге ext/forum/controllers/.
Теперь зайдите на ваш сайт, используя адрес http://site.com/forum/topics. Если вы все сделали правильно, то должны увидеть "Hello World"!.
Зайдите по адресу http://site.com/forum/topics/addpost – и вы увидите "Add post!".
Привязка параметров действий. Параметры действий – это обычные переменные, которые поступают в метод (функцию) извне и используются внутри него. Например, у метода index есть входящий параметр $name:
class forum_controllers_topics extends common_controller { public function index($name) { print 'Hello' . $name . '!'; } }
Допустим, переменная $name будет содержать значение "people". Зайдите по адресу http://site.com/forum/topics/index/name/people, и вы увидите "Hello people!".
В PHP-платформе Wad-er существует поддержка автоматической привязки любого количества параметров к действиям контроллера. Параметры обычно поступают из $_GET, $_POST или $_REQUEST массивов данных. Имя каждого параметра должно совпасть с одним из ключей в $_GET, $_POST или $_REQUEST.
Например, если у нас есть параметр $people, значит должен быть или $_GET['name'], или $_POST[' name '], или $_REQUEST[' name '] в зависимости от того, каким методом были переданы данные. Таким образом, код, показанный выше, можно написать более привычным способом:
class forum_controllers_topics extends common_controller { public function index() { if(isset($_GET['name '])) $name =$_GET['name']; else $name ='people'; print 'Hello' . $name. '!'; } }
Однако этот код требует большего времени написания и переменные из глобальных массивов поступают в необработанном виде, что может нанести вред безопасности сайта.
Маршрутизация методов с параметрами. Для того, чтобы понять, как работает маршрутизация (построение адреса страницы), добавим три параметра к методу index:
class forum_controllers_topics extends common_controller { public function index($name, $qty, $notes) { print 'Hello' . $name. '!'; print 'There are ' . $qty. ' million people in our country. '; print 'They live in ' . $notes; } }
При включенных friendly url адрес страницы формируется двумя способами:
Значения параметров следуют один за другим через слэш в том порядке, как они будут перечислены в аргументах метода. В приведенном примере адрес будет выглядеть так: http://site.com/forum/topics/index/people/58/cities.
Получить параметры внутри контроллера можно так, как показано выше - через переменные: $name, $qty, $notes.
В приведенном примере это будет http://site.com/forum/topics/index/name/people/qty/58/notes/cities, т.е. параметр1/значение_параметра1/параметр2/значение_параметра2. Получить параметры внутри контроллера можно через свойство request базового контроллера
$this->request['name'] $this->request['qty'] $this->request['notes']
или обычным способом через
$_REQUEST['name']
При отключенных friendly url адрес страницы будет таким:
http://site.com/index.php?pageid=forum/topics&action=index&people=люди&qty=38¬es=городах