Первые шаги

Комментарии: 113  Просмотры: 63 013

Итак, Кохану мы благополучно установили. Давайте попробуем разобраться, откуда же появляется эта ужасная надпись hello, world! и даже попробуем заменить ее на что-то другое. Как я уже говорил, в Кохане точкой входа является файл index.php. Если вы его откроете, то почти в самом конце увидите подключение еще одного весьма важного файла под названием bootstrap.php. Чтобы вы не подумали, что я обманываю, вот код:

// Bootstrap the application
require APPPATH.'bootstrap'.EXT;

Если внимательно посмотреть на самое начало файла, то там консанта EXT как раз определяется (как .php), т.е. можно сделать так, что файлы будут иметь другое расширение (не .php) и таким образом всех запутать. Но лучше все-таки этого не делать.
Ну а константа APPPATH — это собственно путь к файлу (который кстати можно гибко настроить). «Собирается» этот путь следующим образом (тут же в файле, рядышком):

$application = 'application';
...
// Set the full path to the docroot
define('DOCROOT', realpath(dirname(__FILE__)).DIRECTORY_SEPARATOR);
 
// Make the application relative to the docroot, for symlink'd index.php
if ( ! is_dir($application) AND is_dir(DOCROOT.$application))
    $application = DOCROOT.$application;
...
// Define the absolute paths for configured directories
define('APPPATH', realpath($application).DIRECTORY_SEPARATOR);

Думаю тут все понятно — мы получаем абсолютный путь к нашему файлу (кстати совершенно аналогично пути прописаны и для двух других папок). Из всего этого видно, что искать файл bootstrap.php надо в папке application. Собственно там он и лежит, прямо в корне. Откроем его и посмотрим в самый низ. Там есть такие строчки:

/**
 * Set the routes. Each route must have a minimum of a name, a URI and a set of
 * defaults for the URI.
 */
Route::set('default', '(<controller>(/<action>(/<id>)))')
        ->defaults(array(
            'controller' => 'welcome',
            'action'     => 'index',
        ));

Пока не будем сильно разбираться, что здесь написано, т.к. Роуты мы рассмотрим более подробно несколько позже. Но чисто визуально видно, что здесь прописан запуск контроллера по умолчанию и контроллером этим является контроллер welcome. А лежит он в папке application/classes/controller. Если мы заглянем в него, то увидим там класс Controller_Welcome у которого есть метод action_index(), который как раз и выводит приветствие. Давайте поэкспериментируем и создадим еще один метод, например test:

public function action_test()
{
    $this->response->body('test!');
}

Как нам теперь вывести test! на экран ? Есть два варианта. Можно прописать в bootstrap.php, чтобы этот метод запускался по умолчанию. Просто в Роуте меняем index на test, т.е. пишем:

Route::set('default', '(<controller>(/<action>(/<id>)))')
        ->defaults(array(
            'controller' => 'welcome',
            'action'     => 'test',
        ));

Запускаем и получаем нашу надпись. Ну или второй вариант (только верните index обратно). Запуск через так называемый ЧПУ (человеко-понятный УРЛ). Попробуйте ввести в адресной строке такой URL:
http://kohana/welcome/test и запустите. Сработало ? На самом деле и не должно было. Так как мы не настроили Кохану до конца. В принципе, если мы поменяем адрес на такой http://kohana/index.php/welcome/test, то все запустится. Но выглядит это мягко говоря странно. Убрать этот index.php в адресной строке очень просто. В файле bootstrap.php есть настройки, в которые мы должны добавить одну строчку ‘index_file’ => FALSE:

/**
 * Initialize Kohana, setting the default options.
 *
 * The following options are available:
...
 * - string   index_file  name of your index file, usually "index.php"       index.php
...
 */
Kohana::init(array(
        'base_url'   => '/',
        'index_file' => FALSE
));

Если почитать комментарий, то видно какие параметры может принимать массив для передачи в статический метод init класса Kohana. Среди них есть как раз ключ index_file, которому мы присваиваем значение FALSE, т.е. не хотим видеть файл index_file.
Следующее, что нужно сделать, — это переименовать файл example.htaccess, который лежит в корне сайта, в .htaccess, чтобы включить модуль Mod Rewrite.
Теперь если мы запустим наш первый вариант, напишем в адресной строке http://kohana/welcome/test, то увидим, что теперь все работает как надо.

<< Назад | Вперед >> | Обсудить на форуме


К записи оставлено 113 коммент.

@brulEx
Должно быть Вы не переименовали example.htaccess в .htaccess

на 99% скорее всего в этом и дело.

* — string index_file name of your index file, usually «index.php» index.php

*/
Kohana::init(array(
‘base_url’ => ‘/’,
‘index_file’ => FALSE
));

Правильнее было бы так
Kohana::init(array(
‘base_url’ => ‘/’,
‘index_file’ => »
));

, так как в комментарии указан
тип string для ключа index_file, хотя оба варианта рабочие.

Kohana::init(array(
‘base_url’ => ‘/’,
‘index_file’ => ‘’
));

Пардон, кавычки как-то странно отобразились)

Ок. Вполне логично кстати :) Ну по сути наверное можно и 0 писать, там видимо все равно к булеву значению приводит при проверке.

Чтоб работал .htaccess нужен AllowOverride All на каталог.
Можно это тоже упомянуть в статье.

ну ..да. но он так и прописан по умолчанию. не видел, чтобы хостер выключал.

Просто сам с этим столкнулся :)
С первого раза не завелось. По-умолчанию выключен был параметр (на локальном сервере). Не сразу нашёл в чём причина.
Умолчальные настройки расслабляют… До этого тоже не сталкивался, чтоб этот параметр был отключен — вот и забыл о его существовании. :)

Добрый день!
Не подскажет кто?
На сайте уважаемого автора ссылка http://kohanaframework.su/kohana/index.php/ — работает, а http://kohanaframework.su/kohana/index.php (без конечного слэша) вызывает ошибку. Как это поправить? Рыть в .htaccess?

Да можно просто роутами обойтись.
Например поменять дефолтный на такой:

Route::set('default', '(<id>)', array('id' => '.+'))
	->defaults(array(
		'controller' => 'page',
		'action'     => 'index',
	));

И ошибки уже нет. Я на тестовом сайте над ошибками специально не колдовал и ничего там не трогал.

Ну теперь у нас любой запрос имеет правильный ответ :)
А почему без array(‘id’ => ‘.+’) не работает?

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

Это-то я понял, но если мы её не задаем, разве мы не предполагаем любую последовательность символов?

Может я плохо смотрел, но существует только ссылка на демосайт? Ссылки на демокод нет?

У коханы по умолчанию настроено регулярное выражение [^/.,;?\n]++ т.е. все кроме слешей, запятых, точек итд
А наше регулярное выражение — это ВСЕ символы.

Ссылки на демокод нет. Если это нужно, могу в архиве куда-нибудь положить все кроме папки system с демо-сайта

Понятно, спасибо.

Наверное, код — это полезно. Ждем ссылку :)

т.е. можно сделать так?
Route::set(‘index’, ‘index.php’)
->defaults(array(
‘controller’ => ‘welcome’,
‘action’ => ‘index’,
));
но всё-таки, наверное, это надо делать в .htaccess.
Только надо разобраться как это сделать :)

а зачем так делать ? зачем вам вообще индекс в адресной строке ?

вот архив
http://kohanaframework.su/data/test_site.zip

http://www.nnnnn.nn/index.php — по-идее правильное обращение к сайту, а выдает по умолчанию ошибку.
Вот это и не понравилось.
А в Вашем варианте http://www.nnnnn.nn/чтоугодно переадресует на главную страницу. Т.е. 404 ошибок не будет. Хотя, может так и правильно.
За код спасибо — посмотрю обязательно.

По демосайту:
При выборе в меню пункта «Статьи» — перечень статей не отображается.

Ну положим не «чтоугодно» переадресует на главную страницу, а только то, что не подпадает под правила роутов, поставленных выше. Что касается 404 ошибки…что мешает генерировать страницу, когда, например, выбрана статья, которой не существует в базе.

По демосайту — при выборе в меню пункта Статьи должно просто писать «Список всех статей» и внизу пагинатор. Это же образец. И еще-учтите, что сайт должен быть в подпапка, как здесь…
Т.е. что-то вроде
http://kohanasite/kohana/
или уберите в .htaccess и bootstrap.php после слеша указанную папку kohana

и если вы хотите копнуть поглубже, может стоит все-таки на форум перейти ))

Вставил в .htaccess 14 строку
RewriteRule ^index\.php$ index.php/ [L]
и пошел на форум. Спасибо за ответы!



Оставить комментарий или два

Пожалуйста, зарегистрируйтесь для комментирования.