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

Рубрика: Web frameworks
Метки: |
Понедельник, 3 августа 2009 г.
Просмотров: 1904
Подписаться на комментарии по RSS

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

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

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

  1.  <VirtualHost *:80>
  2.      ServerAdmin admin@ko3.loc
  3.      DocumentRoot d:\\xampp\\htdocs\\ko3.loc\\www\\
  4.      ServerName ko3.loc
  5.     ServerAlias www.ko3.loc
  6.  </VirtualHost>

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

  1.  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. Итак, контроллер превращается в

  1.  class Controller_Welcome extends Controller {
  2.      public function action_index()
  3.      {
  4.          $this->request->response = 'hello, world!';
  5.      }
  6.      public function action_page1()
  7.      {
  8.          $this->request->response = 'hello, world<br />page 1!';
  9.      }
  10.      public function action_page2()
  11.      {
  12.          $this->request->response = 'hello, world<br />page 2!';
  13.      }
  14.  }

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

  1.  # Installation directory
  2.  RewriteBase /

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

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

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

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

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

  1.  Route::set('default', '(<action>(/<id>))')
  2.      ->defaults(array(
  3.          'controller' => 'welcome',
  4.          'action'     => 'index',
  5.      ));

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

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

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

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

  1.  protected function _simple_nav()
  2.  {
  3.  }

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

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

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

  1.      $slugs = '';
  2.      foreach ($methods as $method_object)
  3.      {
  4.          $pos = strpos($method_object->name, 'action_');
  5.         
  6.          if ($pos !== 0)
  7.          {
  8.              continue;
  9.          }
  10.          $slug = substr_replace($method_object->name, '', 0, 7);
  11.          if ($slug === '')
  12.          {
  13.              continue;
  14.          }
  15.             
  16.          $m = new ReflectionMethod('Controller_Welcome',$method_object->name);
  17.          if ($m->isPublic())
  18.          {
  19.              $slugs .= HTML::anchor($slug, url::title($slug)).'<br />';
  20.          }
  21.      }

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

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

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

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

]]>twitter.com Google Buzz google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru]]>

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

  1. 2009-08-03 в 16:32:21 | Sezarin
    ]]>]]>

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

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

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

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

  3. 2009-09-29 в 12:54:29 | Александр (анонимно)

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

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

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

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

  5. 2009-11-08 в 02:23:30 | Сергей (анонимно)

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

    в описании

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

    2 Сергей

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

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

Не регистрировать/аноним

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

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



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