Контент


Знакомимся с Kohana

Итак, давайте посмотрим 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 в действии.

Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong

Опубликовано в учебник.

Теги: , .


Комментарии (4)

Будьте в курсе обсуждения, подпишитесь на RSS ленту комментариев к этой записи.

  1. Andrei пишет:

    А есть мысли про использование любого другого метода контроллера по умолчанию без набора названия самого контроллера??

    т.е.
    есть контроллер по дефолту test,
    у него есть методы
    index
    test1
    test2

    если вызвать
    localhost/ то входим в метод index
    localhost/test/ то входим в метод index
    localhost/test/index то входим в метод index
    localhost/test/test1 то входим в метод test1

    а вот как попасть в test1 набрав localhost/test1 ???

  2. BIakaVeron пишет:

    Для этого надо настраивать роутинг. Как это делается для Router3 я писал в статье Новые возможности роутинга, а вот так (не проверял) получится для стандартной библиотеки:

    $config['(test1|test2)/'] = 'test/$1/';

    В общем, копайте в направлении Routing официальной документации.

  3. Ol пишет:

    доброго времени суток.
    только начинаю изучать фреймверк. есть такая проблема: работают адреса вида http://kohana/index.php/main/index, но не работают вида http://kohana/main/index. хотя, на сколько я понимаю, должны работать оба варианта.
    в конфиге: $config['index_page'] = ‘index.php’;

  4. BIakaVeron пишет:

    Добро пожаловать, Ольга!
    Судя по всему, Вам сюда.



Можно включить подсветку кода: <code><pre lang="">...</pre></code>
Разрешены некоторые HTML теги

или используйте trackback.