Одной из замечательных особенностей концепции MVC является четкое разделение логики и представления. Как вы знаете, MVC расшифровывается как Модель-Вид-Контроллер. Контроллер — это прослойка между моделью и видом, в то время как Вид — это вывод какой-то информации пользователю. Контроллер является классом со своими методами, а Вид — это смесь html-кода с php-кодом. Хорошим тоном считается использовать Виды только для вывода данных и не использовать для какой-то логики.
Давайте откроем наш знакомый Контроллер Welcome, объявленный по умолчанию и рассмотрим его подробно.
<?php defined('SYSPATH') or die('No direct script access.'); class Controller_Welcome extends Controller { public function action_index() { $this->response->body('hello, world!'); } }
Первая строчка — защита от прямого доступа к Контроллеру. Об этом я уже упоминал в одном из уроков. Если кто-то попробует напрямую обратится к этому файлу, то получит сообщение, что No direct script access, так как константа SYSPATH у нас объявлена в index.php, следовательно будет неопределена при прямом обращении. В следующей строчке идет объявление класса Controller_Welcome, который расширяет класс Controller, т.е. наследует все свойства и методы родительского класса.
При создании контроллера нужно придерживаться следующих правил:
Как мы видим, контроллер welcome удовлетворяет этим требованиям. Он находится в папке classes/controller/, называется welcome.php. Сам класс имеет название Controller_Welcome и, наконец, он расширяет класс Controller.
Следующая строка — это public function action_index(). В ней происходит создание так называемого действия (action) под названием index. Контроллер, как и любой другой класс, может содержать приватные, защищенные или общедоступные (private, protected или public) свойства и методы, а также наследовать классы и методы родительского класса и перезаписывать их.
Любой public-метод в классе контроллера, который имеет префикс action_ считается таким методом, который напрямую можно вызывать через адресную строку. Если вы помните, в уроке Первые шаги мы создавали новый метод action_test, который выводил слово test! при обращении по адресу http://kohana/welcome/test. Это как раз то, о чем я только что говорил. А назывался бы метод просто test, ничего бы не вышло и мы получили бы сообщение об ошибке. Мы обязательно рассмотрим роутинг более подробно, так как это очень важная тема. Но я думаю вы уже поняли, как формируются адреса в Кохане. Схематично это можно представить так http://kohana/controller/action, т.е. после первого разделителя идет название контроллера, потом идет название action-а (при его отсутствии берется action по умолчанию, прописанный в bootstrap.php). Немного забегая вперед скажу, что дальше могут быть еще разделители. В таком случае это уже идет передача каких-то параметров внутрь метода (action-а).
Ну и наконец, последняя строка в контроллере $this->response->body(‘hello, world!’); производит вывод надписи hello, world! в окно браузера. На самом деле осуществлять вывод таким образом несколько некорректно. Весь вывод данных в браузер должен производится в Видах. Об этом мы и поговорим в следующем уроке.
<< Назад | Вперед >> |
Пожалуйста, зарегистрируйтесь для комментирования.
…Вот интересно мне, в Кохане есть роуты и контроллеры, которые хавают адрес из строки и ищут /контроллер/экшн/ которые по сути являются физически файлом, классом и методом (экшн). А можно ли сделать динимические роуты в Кохане, чтобы он искал, скажем в БД иерархически вложенный узел (типа /section1/subsection_1_1/) и уже согласно параметрам из БД, запускал определенную процедуру для вывода нужного контента?
Чтобы был как бы один глобальный контроллер корневого роута (/) и в нем описать, что, мол запрошен узел новостей, а внем рубрика «такая-то», и новость «вот-такая-то».
Можно обойтись одним контроллером,а параметры в адресной строке будут вызывать определенные методы класса. Это настраивается в бутстрапе в роутинге.
А можно странный вопрос? Раз Кохана (и ПХП 5.3) полностью поддерживает utf-8, почему нельзя имена котроллеров называть по-русски, и обращаться к ним в адресной строке так сказать, на родном языке.. Вот например action’ы можно, пробовал. Я в PHP новичек, может не так понял чего..
Конечно будет, чего ему не работать. И переменные вида
$имя = ‘Вася’;
будут работать. Только зачем ? Иногда с такими вот адресами на русском возникают проблемы.
Пробую, не работает.. Чтобы в адресной строке перейти по адресу localhost/техника/бытовая, я как понимаю контроллер должен быть назван «Controller_Техника» (файл техника.php), а экшн — «бытовая», но в моем случае говорит что контроллер «техника» не найден.
Для чего это нужно? Ну например когда дело касается сайтов на .рф, как-то некрасиво получается «президент.рф/about/me», согласитесь..
И насчет проблем. Utf-8 разве не идеален? Откуда взяться проблемам?
Извиняюсь, если сложно изъясняюсь.
Тут лучше все-таки action-ами манипулировать. Контроллер называем как обычно, на английском, а action допустим action_техника. А бытовая-это уже будет параметр, например type. Его мы получим внутри метода и будем использовать. Ну и роут будет стандартный, только для action-а будет регулярка вида
array(‘action’ => ‘техника|машины’))
Тогда по адресу сайт/техника запустится нужный контроллер с экшном «техника», а для машин — экшн «машины».
Что касается проблем-иногда увы происходит конвертация русских слов в адресе. Особенно при работе с такими адресами на сторонних ресурсах.
Исчерпывающий ответ, спасибо большое!
Да, проверял, проблемки все же есть Эх, все в этом мире неидеально..
А ведь класно было бы набирать «хттп://работа.рф/вакансии/новые.хтмл»
аа, кажись понял))
Вы или сеошник или извращенец)
Здравствуйте! Стремление к совершенствованию Kohana привело к тому, что версия 3.3.0 не видит параметры в строке public function action_index($name). Поэтому приветствия $this->response->body(‘hello, ‘. $name)скрипт не выводит. Подскажите, пожалуйста, в чем проблема или гже это можно выяснить?
ИСПРАВЬТЕ СТАТЬЮ!
«Название файла должно быть в нижнем регистре и заканчиваться .php»
В версии 3.3 имена моделей и контроллеров начинаются с ЗАГЛАВНОЙ буквы, иначе выскочит ошибка 404.
А мы тут про 3.2 беседуем, если чо )