Pull to refresh

Барахолка на Kohanaphp. Часть 1

Reading time 4 min
Views 1.3K
Делаем то же самое что и здесь, только используя Kohanaphp:

Отличия kohanaphp от codeigniter:

* Использует PHP 5 ООП
* Абстракция базы данных, используя SQL helpers
* Разнообразные драйвера сессий (native, database и cookie)
* Обработчик событий
* Основан на базе CodeIgniter
Получить kohana можна на сайте kohanaphp.


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

Конфигурация kohanaphp


Конфигурация kohanaphp устроена немножко по-другому:
<?php
// вещи, которые идентичны или похожи с CodeIgniter не буду здесь затрагивать
//... site_domain вместо base_url
$config['site_domain'] = 'habrastore.ru';
//....
// У kohanaphp каскадная файловая система и родная поддержка i18n, есть отличия для вычисления путей к
// файлам, internal_cache позволит кешировать все внутренние пути к файлам. на дев хосте лучше FALSE,
// пойдете live -- укажите количество секунд для кеша.
$config['internal_cache'] = FALSE;

// Хуки в kohanaphp не вынесены в отдельный файл, а находятся в основном конфиге. либо массив с именами
// хуков либо TRUE для всех
$config['enable_hooks'] = array('multilingual');

/**
* Log thresholds:
* 0 - Disable logging
* 1 - Errors and exceptions
* 2 - Warnings
* 3 - Notices
* 4 - Debugging
*/
// та же история с логами
$config['log_threshold'] = 1;

/**
* Message logging directory.
*/
$config['log_directory'] = APPPATH.'logs';

/**
* Additional resource paths, or "modules". Each path can either be absolute
* or relative to the docroot. Modules can include any resource that can exist
* in your application directory, configuration files, controllers, views, etc.
*/
// интересно с модулями. по реализации каскадной FS порядок подключения модулей играет роль.
// вот список тех, которые я обычно использую
$config['modules'] = array
(
MODPATH.'auth', // Authentication
MODPATH.'grige', // Генерация гридов (мой личный ответ гридам с PEAR, я их ненавижу =) )
MODPATH.'service',// модуль для работы с разными API а-ля last.fm и прочего
MODPATH.'openid',
MODPATH.'payment',
// MODPATH.'kodoc', // Self-generating documentation
// MODPATH.'media', // Media caching and compression
);

Замечу, что опции аутолоуда нету, потому и в конфиге его искать не надо.

Дальше на счет поддержки разных языков, насколько я помню. Можно решать по-другому совсем. Делаем следующее:
модифицируем /appllication/config/locale.php:
<?php
$config['language'] = array('ru_RU');

/**
* Locale timezone. Defaults to use the server timezone.
* @see php.net/timezones
*/
$config['timezone'] = 'Europe/Brussels';

/**
* All languages this site is available in.
*/
$config['allowed_languages'] = array
(
'ru' => 'ru_RU',
'en' => 'en_US',
);

/**
* Дефаултный язык
*/
$config['lang'] = 'ru';


Мультиязычность


И делаем небольшой хук (справа) для поддержки мультиязычных урлов
application/hooks/multilingual.php:
<?php

Event::add_after('system.routing', array('Router', 'find_uri'), 'site_lang');

function site_lang()
{

// Получаем массив с языками сайта
$allowed_languages = Kohana::config('locale.allowed_languages');
// Получаем язык с урла
if (preg_match('~^[a-z]{2}(?=/|$)~i', Router::$current_uri, $matches))
{
$lang = strtolower($matches[0]);

// А вдруг нам пользователь хочет подсунуть свинью?
if ( ! array_key_exists($lang, $allowed_languages)) {
Event::run('system.404');
}

// Сохраняем переменные пользователя
Kohana::config_set('locale.lang', $lang);
Kohana::config_set('locale.language', array($allowed_languages[$lang]));

// Переписываем то что сначала было зделано в Kohana::setup()
setlocale(LC_ALL, $allowed_languages[$lang].'.UTF-8');
Router::$current_uri = substr(Router::$current_uri, 3);

if (empty(Router::$current_uri)) {
Router::$current_uri = 'store';
}
}

// Не нашли мы в урле языка =(
else
{
Kohana::config_set('locale.language', array($allowed_languages[Kohana::config('locale.lang')]));
}
}


Ха, тепер осталось зделать хелпер который будет нам урлы красивые давать
application/helpers/MY_html.php
<?php

class html extends html_Core {
public static function lanchor($uri, $title = NULL, $attributes = NULL, $protocol = NULL)
{
return self::anchor(Kohana::config('locale.lang').'/'.$uri, $title, $attributes, $protocol);
}
}



Вот вроде все зделал аналогично тому, что и в статье про CodeIgniter.

База даных


Ах да, забыл про базу данных. Я не думаю, что она будет отличатся от базы, которую нам предлагает автор оригинальной статьи, упомяну только что буду использовать родной ORM kohanaphp, потому напишу сразу как буду называть таблицы и поля:
  • Таблица для пользователей будет называтся users. Тоесть сущности во множественном числе.
  • Внешний ключ для пользователя будет user_id. Тоесть внешные ключи будут «сущности в единственном числе»_id


Вот и все


Так как Kohana форк CodeignIter, то ход мыслей должен быть понятен для CI-шника. Вопросы и уточнения приветсвуются. Я нарошно выбрал такой путь, чтобы не использовать контроллер для таких вещей, потому что мне кажется, что контроллер должен заниматся другими делами следуя с парадигмы MVC и должен быть language-agnostic.

Так же на счет русского: извините, он мне не родной, потому я думаю, что есть ошибки. Если вы заметили — пожалуйста дайте мне знать, я исправлю.

Tags:
Hubs:
+5
Comments 5
Comments Comments 5

Articles