Итак, давайте посмотрим Kohana в действии. Откроем стартовую страницу проекта (например, http://localhost/ или http://localhost/index.php. Конечно у Вас она может отличаться, в дальнейшем я в качестве стартовой буду иметь в виду http://localhost). Мы видим зеленую страницу с приветствием. В текстовом блоке есть ссылка, щелкнув по которой, мы попадаем на ту же самую страницу, но URL становится http://localhost/index.php/welcome/index. Предлагаю разобраться, как фреймворк ее формирует.
По умолчанию фреймворк ожидает URL вида ‘http://localhost/контроллер/метод‘. Если метод не указан, берется index(). А что, если не указан контроллер? Судя по всему, стартовым контроллером был Welcome_Controller (ведь после клика на http://localhost/index.php/welcome/index загрузилась та же страница). Но где прописано это значение? Открываем файл /system/config/routes.php и видим там искомую строчку:
$config['_default'] = 'welcome'; |
Это означает, что по умолчанию (ключ ‘_default’) будет использоваться контроллер ‘welcome’ (т.е. Welcome_Controller из файла controllers/welcome.php). Скопируем файл routes.php из папки system в нашу «песочницу», т.е. в application. Теперь можно экспериментировать с маршрутизацией нашего проекта.
Поменяйте значения параметра $config['_default'] последовательно на ‘welcome/index’, ‘welcome/index1′, ‘welcome1′. Что теперь происходит при открытии стартовой страницы? Почему?
Ну, если с первым вариантом все понятно (просто добавили явно обращение к методу index() контроллера welcome), третий вариант в принципе понятен — такого контроллера (‘welcome1′) мы не создавали, то почему же при $config['_default'] = ‘welcome/index1′ вместо 404й ошибки появилась непонятная строка на английском? Ответ лежит в файле application/controllers/welcome.php:
public function __call($method, $arguments) { // Disable auto-rendering $this->auto_render = FALSE; // By defining a __call method, all pages routed to this controller // that result in 404 errors will be handled by this method, instead of // being displayed as "Page Not Found" errors. echo 'This text is generated by __call. If you expected the index page, you need to use: welcome/index/'.substr(Router::$current_uri, 8); } |
Мы видим в действии «волшебный» метод __call(), вызываемый, если происходит обращение к несуществующему методу класса. В идеале такие методы следует использовать вместо страницы с 404й ошибкой, например, подсказывая пользователю возможную ошибку в URL.
Раз уж мы забрались в исходник контроллера, давайте посмотрим остальные его части (из скрипта удалены лишние комментарии и пара строк):
<php defined('SYSPATH') OR die('No direct access allowed.'); class Welcome_Controller extends Template_Controller { public $template = 'kohana/template'; public function index() { $this->template->content = new View('welcome_content'); $this->template->title = 'Welcome to Kohana!'; $this->template->content->links = array ( 'Home Page' => 'http://kohanaphp.com/', 'Documentation' => 'http://docs.kohanaphp.com/', 'Forum' => 'http://forum.kohanaphp.com/', 'License' => 'Kohana License.html', 'Donate' => 'http://kohanaphp.com/donate.html', ); } public function __call($method, $arguments) { // этот метод мы уже рассмотрели } } // End Welcome Controller |
В начале идет стандартная проверка, открыт ли файл в рамках проекта (в index.php создается константа SYSPATH). Далее идет определение контроллера. Имя класса состоит из собственно имени контроллера (‘Welcome’) с большой буквы и суффикса ‘_Controller’.
Внутри сначала определяется параметр template (он хранит имя представления, связанного с этим контроллером) по умолчанию, далее идет метод index(). В нем инициализируются переменные шаблона (content и title). В свою очередь, переменная $this->template->content также является представлением (View) и содержит переменную $links. Чтобы было понятнее, рассмотрим часть скрипта application/views/welcome_content.php:
// выше были выведены блоки текстовой информации <?php foreach ($links as $title => $url): ?> <li><?php echo ($title === 'License') ? html::file_anchor($url, html::specialchars($title)) : html::anchor($url, html::specialchars($title)) ?></li> <?php endforeach ?> |
В данном шаблоне мы видим обработку переменной $links. Из контроллера она была доступна как $this->template->content->links (читаем как переменная $links в шаблоне $content, который в свою очередь является переменной $content шаблона $template). Шаблоны могут быть вложены друг в друга и в использовании принципиально от переменных не отличаются.
Конструкции html::file_anchor() и html::specialchars() являются вызовами методов хэлпера HTML (хэлперы мы упоминали в статье Файловая система Kohana).
Вот собственно и все. Контроллер заполняет какие-то данные для представления, представление все это честно пытается отобразить. В следующей статье мы создадим свой контроллер, свои представления, а также — свою модель, дабы увидеть все три звена MVC в действии.
А есть мысли про использование любого другого метода контроллера по умолчанию без набора названия самого контроллера??
т.е.
есть контроллер по дефолту test,
у него есть методы
index
test1
test2
если вызвать
localhost/ то входим в метод index
localhost/test/ то входим в метод index
localhost/test/index то входим в метод index
localhost/test/test1 то входим в метод test1
а вот как попасть в test1 набрав localhost/test1 ???
Для этого надо настраивать роутинг. Как это делается для Router3 я писал в статье Новые возможности роутинга, а вот так (не проверял) получится для стандартной библиотеки:
В общем, копайте в направлении Routing официальной документации.
доброго времени суток.
только начинаю изучать фреймверк. есть такая проблема: работают адреса вида http://kohana/index.php/main/index, но не работают вида http://kohana/main/index. хотя, на сколько я понимаю, должны работать оба варианта.
в конфиге: $config['index_page'] = ‘index.php’;
Добро пожаловать, Ольга!
Судя по всему, Вам сюда.