Первые шаги

Комментарии: 113  Просмотры: 67 971

Итак, Кохану мы благополучно установили. Давайте попробуем разобраться, откуда же появляется эта ужасная надпись 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 коммент.

Странно, но в опере Ваш сайт не работает почему-то.

В каком плане не работает ? Совсем ? Проверил в Опере 11.52 только что, все работает.

Не заполняется форма, не могу зарегиться…не приходит письмо с паролем. Сейчас пишу с Mozill’ы.

Не пойму почему регистрация не приходит? Есть много вопросов, а куда писать не понятно.

Поправил. Эти все мейл.ру фильтруют очень сильно. Запроси сброс пароля через Забыли пароль. Должно прийти.

Спасибо — работает.Уже зарегился.Довольно доступно пишете — спасибо.

всех с праздником.
Поставил кохану, решил протестировать и в шоке, не видит параметр передаваемый, с чем связано?

1 response->body(‘hello,’.$name);
8 }
9
10 } // End Welcome

это ошибка на экране, как такое может быть, ведь передаю же параметр

не прошел код в комментарий((( вот ссылка на скрин, помогите плз http://i28.fastpic.ru/big/2012/0101/82/7970c51572ca86e5c61e2808fe432982.png

Насколько мне стало известно, данная передача параметра была помечена, как depricated (нежелательная) в версии 3.1, а в версии 3.2 ее вообще убрали. Получайте значение $name через
$name = $this->request->param(‘name’);
внутри метода, что гораздо удобнее, так как становится абсолютно неважен порядок следования аргументов.
подробнее здесь:
http://kohanaframework.su/advanced/route_p3

ага, разобрался, понимаю что так не надо, просто поставил себе, и просто решил протестировать, и тут бац — не работает, весь инет перерыл, не мог понять от чего. Плохо что нет дока по поводу разниц между версиями, хотя бы 3.2 — 3.1 А то учишь по немногу из каждого сайта , после окажется , что так не надо.

классный ресурс у вас, удачи вам

На хабре где-то вроде писали. Вообще да, собирать приходится по крупицам. Я тоже написал, не проверил. Помню, что работало..по всей видимости то была версия 3.1 еще. Вообще стараюсь проверять всегда, чтобы 100% быть уверенным, что работает, а тут не проверил. Ну в статье поправил. Спасибо вам за то, что обратили внимание на этот нюанс :)
И с Новым годом.

Странно то, что у меня после переименования example.htaccess браузер возвращает 500 ошибку. Логи пишут на косяк в парсинге регулярки:

RewriteRule: cannot compile regular expression ‘^(?:application|modules|system)\\b.*’\n

Есть объяснение этому?
Если убрать «?:», то всё ок. Но я не могу понять почему это мешает…

как я понимаю в Денвере всё нормально, судя по тому что нет комментов по этому поводу

Я сразу на тестовом сервере развернул, чтобы не биться при переносе готового проекта с всплывшими ошибками.

Вообще ошибка 500 выдается вроде, если хостер не поддерживает mod rewrite. Уточните этот вопрос.

Mod Rewrite как раз работает. Не может обработать строку в htaccess
RewriteRule ^(?:application|modules|system)\b.* index.php/$0 [L]

ему «?:» не нравится почему то… Без них всё ок, как писал выше.

не может скомпилировать регулярку. возможно старый апач на сервере ?

Да, дело было в Apache. Попросил поддержку перекинуть сайт на сервер со свежм апачем. Стало всё ОК.

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

делаю ‘index_file’ => FALSE
а ошибка

Not Found

The requested URL /index.php/welcome/test was not found on this server.

остается, в чем причина помогите



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

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