Развертывание Kohana3 на XAMPP под Windows

Просмотров: 8192Комментарии: 6
Web frameworks

В свободную минуту поддался соблазну посмотреть на новую версию Kohana. Решил заодно оформить это как-то в виде туториала. То, что изложено ниже, претендует на самый базовый уровень, но если кому интересно — читайте, комментируйте.

1. Эмулятор серверной среды XAMPP для Windows можно взять здесь. Про установку и настройку не буду, все хорошо описано в документации.

Для создания домена совершаем обычную для XAMPP процедуру — создаем папку в htdocs, например, htdocs/ko3.loc, затем отмечаемся в apache/conf/extra/httpd-vhosts, что-то типа

<VirtualHost *:80>
    ServerAdmin admin@ko3.loc
    DocumentRoot d:\xampp\htdocs\ko3.loc\www\
    ServerName ko3.loc
   ServerAlias www.ko3.loc
</VirtualHost>

Наконец, дополняем системный %Windows%\System32\drivers\etc\hosts как-то так:

127.0.0.1       ko3.loc

2. Скачиваем Кохану с гитхаба (UPD: после релиза можно взять с офсайта). Копируем в htdocs/ko3.loc/www дистрибутив, запускаем Апач и идем браузером на http://ko3.loc.

3. После успешного прохождения теста на системные требования удаляем или переименовываем install.php из корня.

4. Обновляем страницу в браузере — перед нами простой «hello, world!». Система работает. Но невесело как-то…

5. Какой же сайт из одной страницы? То есть, конечно, можно, но смысл тогда фреймворк использовать? Давайте сделаем еще одну, нет, еще две страницы! Благодаря Ивану Броткину, нам уже должно быть ясно, что для создания простейшей страницы надо всего лишь добавить в контроллере приложения (в данном случае это файл  application/classes/controller/welcome.php) метод «action_***», где вместо звездочек прописать имя страницы. Назовем их по-простому: page1 и page2. Итак, контроллер превращается в

class Controller_Welcome extends Controller {
    public function action_index()
    {
        $this->request->response = 'hello, world!';
    }
    public function action_page1()
    {
        $this->request->response = 'hello, world<br />page 1!';
    }
    public function action_page2()
    {
        $this->request->response = 'hello, world<br />page 2!';
    }
}

6. Ага, надо еще в .htaccess установить

# Installation directory
RewriteBase /

Это еще не все, но если вы сейчас обновите страницу в браузере, то увидите новую фирменную  debug-панель с сообщением об ошибке smile.

7. Налюбовавшись избытком отладочной информации, исправим, все-таки, нашу оплошность. В файле application/bootstrap.php, определяющем рабочий цикл системы, пропишем:

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

Эти настройки означают, что дистрибутив лежит в корне, а фронтэнд в явном виде не указывается (определяется в .htaccess). Теперь в браузере идем на http://ko3.loc/welcome/page1 или http://ko3.loc/welcome/page2. Все получилось!

8. Кстати, зачем нам такой некрасивый URL? Ведь других контроллеров у нас не будет, поэтому использовать этот сегмент явно излишне. Не проблема: в уже известном нам файле application/bootstrap.php меняем дефолтный Route на такой:

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

Он означает, что дефолтным контроллером у нас всегда будет welcome, а в URL будут задаваться только метод контроллера и переменная.

Сейчас идем на http://ko3.loc/page1 и наслаждаемся простотой и лаконичностью всего гениального.

9. Процесс наслаждения слегка портится отсутствием навигации. Какой же Интернет без гиперссылок? Надо сделать навигацию, хотя б самую простую. Хотя, зачем нам самая простая? Пусть автоматически создается — не руками же прописывать!

Итак, добавляем в наш контроллер новый метод, отвечающий за формирование простейшей панели навигации

protected function _simple_nav()
{
}

Дальше все просто: создаем отражение класса, чтобы получить его методы

$class = new ReflectionClass('Controller_Welcome');
$methods = $class->getMethods();

Потом в цикле перебираем каждый метод, проверяя, отвечает ли он за вывод страницы и публичный ли он

    $slugs = '';
    foreach ($methods as $method_object)
    {
        $pos = strpos($method_object->name, 'action_');
       
        if ($pos !== 0)
        {
            continue;
        }
        $slug = substr_replace($method_object->name, '', 0, 7);
        if ($slug === '')
        {
            continue;
        }
           
        $m = new ReflectionMethod('Controller_Welcome',$method_object->name);
        if ($m->isPublic())
        {
            $slugs .= HTML::anchor($slug, url::title($slug)).'<br />';
        }
    }

Далее там, где надо, вызываем метод

$this->request->response = $this->_simple_nav().'<p>hello, world!!</p>';

Ну вот, пока это все. Надеюсь, продолжение не заставит себя ждать. Успехов!

PS Готовый контроллер можно взять здесь.

Комментариев: 6 RSS

1 Sezarin 03-08-2009 16:32

Как-то непривычно видеть в Route::set() фактически html-ный

таг /... А как же /:id ?

2 Александр Купреев 04-08-2009 12:52

да, непривычно, но так уж сделано. Если никто не опередит, то на Route остановлюсь подробнее

3 Александр 29-09-2009 12:54

Функцию для навигации можно сделать универсальнее, заменив 'Controller_Welcome' на константу __CLASS__

4 Александр Купреев 29-09-2009 14:49

Александр, спасибо за замечание!

Действительно, если в методе Controller_Welcome::_simple_nav() мы заменим 'Controller_Welcome' на магическую константу __CLASS__, возвращающую имя класса, из которого она вызвана (здесь $class = new ReflectionClass('Controller_Welcome'); и здесь $m = new ReflectionMethod('Controller_Welcome',$method_object->name);), то код станет проще и вероятность ошибок уменьшится.

5 Сергей 08-11-2009 02:23

return ($slugs); забыли в _simple_nav()

в описании

6 Александр Купреев 09-11-2009 12:50

2 Сергей

оставил на самостоятельное доделывание smile

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


Используйте нормальные имена.

     

  

Если вы уже зарегистрированы как комментатор или хотите зарегистрироваться, укажите пароль и свой действующий email. При регистрации на указанный адрес придет письмо с кодом активации и ссылкой на ваш персональный аккаунт, где вы сможете изменить свои данные, включая адрес сайта, ник, описание, контакты и т.д., а также подписку на новые комментарии.

MaxSiteAuth. Войти через loginza

(обязательно)