Создание модуля на фреймворке Kohana
В этой статье хочу рассказать как создать свой модуль на фреймворке Kohana.
Что такое модуль, описывается тут
Немного теории
Сам фреймворк имеет 3 основные папки:
application — тут храниться ваш проект
modules — тут модули
system — тут ядро
Все названия папок и файлов, новых и старых, пишутся с маленькой буквы, желательно латинского алфавита, т.к. в методе Kohana::auto_load() все файлы приводятся к нижнему регистру. На это стоит обратить внимание, т.к. на ОС *unix это вылезет и будут потом куча вопросов, а чего у меня (под ОС Windows) работает, а тут нет!!!!! Насчет латиницы, ну тут особых ограничений нет, но принято всё писать латиницей!
Создания модуля
Заходим в папку modules и создаем необходимую нам папку.
Для того, чтобы это было наглядней создадим модуль для получения валюты из центробанка РФ на текущий день (украинского НБУ, не нашел api). Назовем папку модуля — currency (в названии папки можно использовать знак _).
modules
currency
Далее нужно создать простой класс, для какой-то работы, то просто в этой папке его и создаем, например класс назовем Test, значит файл будет называться test.php (расширение должно быть такое, какое описано в index-файле вашего проекта, константа define(‘EXT’, ‘.php’);)
Если же будите использовать MVC паттерн, то надо создать особую структуру папок.
classes -эта папка для классов контроллера и моделей
controller — если есть контроллер, то он храниться тут (назв Controller_Name, файл name.php)
model — тут модель, если есть (Model_Name, name.php)
config — хранятся всяческие настройки для модуля
views — шаблоны для отображения
vendor — библиотеки сторонних производителей
init.php — файл, инициализируемый при подключении модуля
Ессно, что всех этих папок может не быть, это структура папок, скажем по-умолчанию.
Как подключить модуль
Заходим в файл проекта — bootstrap.php и добавляем в описание модулей свой
Kohana::modules(array( 'auth' => MODPATH.'auth', // Basic authentication 'database' => MODPATH.'database', // Database access 'image' => MODPATH.'image', // Image manipulation 'orm' => MODPATH.'orm', // Object Relationship Mapping 'pagination' => MODPATH.'pagination', // Paging of results 'cache' => MODPATH.'cache', // Cache module 'currency' => MODPATH.'currency', // Подключения модуля получения валюты!!!!! ));
Загрузка модулей во фрейм будет в той последовательности, в которой они добавления в этот массив.
При загрузке сразу подключается файл init.php, если он есть, при инициализации модуля. Обычно в этом файле пишут роутер по которому будет доступна работа модуля, если такое требуется.
Переходим к практике
Структура папок описано, начнем писать.
Описываем файл инициализации init.php:
// Роутеры для работы с валютами Route::set('currency', 'getcurrency(/<date>)', array('date'=>'([0-9\/]+)')) ->defaults(array( 'controller' => 'currency', 'action' => 'index', 'date' => NULL, ) );
Далее описываем работу с контроллером Controller_Currency (currency.php):
class Controller_Currency extends Controller { /** * Получение данных по указанному дню * * @return void */ public function action_index() { $date = $this->request->param('date', date('d/m/Y')); $currency_model = new Model_Curr; $currency_data = $currency_model->get_currency_from_server($date); print_r($currency_data); } }// End Currency Controller
Описываем работу модели Model_Curr (curr.php):
class Model_Curr extends Model { /** * Получения данных с сервера ЦБРФ (http://www.cbr.ru/) * * @param string $date текущая дата * @return string */ public function get_currency_from_server($date) { $allow_currency = array('EUR', 'USD'); $link = "http://www.cbr.ru/scripts/XML_daily.asp?date_req=$date"; $text = @file_get_contents($link); $xml = new SimpleXMLElement($text); foreach ($xml->Valute as $curr) { if(in_array($curr->CharCode, $allow_currency)) { $currency[] = $date . ' ' . $curr->CharCode . ' ' . UTF8::str_ireplace(',', '.', (string)$curr->Value); } } return $currency; } } // End Currency Model
В итоге набираем в строке адреса вашего браузера ссылку http://yourprojectname/getcurrency/14/06/2010
и на экране получаем ответ:
Array ( [0] => 24/03/2012 USD 29.4038 [1] => 24/03/2012 EUR 38.8189 )
Демо тут
Данные по валюте получены. Модуль можно использовать в других проектах.
Подводные камни
При работе с модулями могут произойти некоторые проблемки.
1 Если имеется в проекте роутер с таким же урлом как в файле инициализации модуля, то роутер модуля будет замещен роутером проекта.
Для избегания, просто делаем другой роутер или ставим описание роутера проекта раньше чем описание загрузки модулей в файле bootstrap.php.
2 Если одинаковое название моделей, то модель будет вызвана из проекта, а не из модуля!!! Обойти эту проблему мне не удалось, т.к. само ядро ищет файл в проекте и если найдено поиск дальше не идет, а если нет, то ищется пока не будет найдено. Единственный выход — прописать другое название для модели.
UPD: Пересобрал модуль для версии Kohana 3.2, часть комментариев уже не валидны. Через время выложу на github.com
UPD2: Выложил всё на GitHub
Статья просмотренна 103106 раз, зашло посетителей 28378