Kohana

Kohana устарела и больше не поддерживается, разработка прекращена. Используйте другие современные фреймверки. Удачи!

Ниже рассматривается Kohana версии 3.3.0(stable) и выше.

Kohana PHP5 Framework использует модель MVC (Model-View-Controller). Установка фреймворка Kohana проста, достаточно запустить из корня файл install.php, который проверит права на директории logs, cache

chmod 0777 application/cache
chmod 0777 application/logs

и проверит установлены ли необходимые зависимости PHP. После устранения всех ошибок файл install.php нужно удалить и комментировать в index.php строки:

if (file_exists('install'.EXT))
{
	// Load the installation check
	return include 'install'.EXT;
}

После установки фреймворка работает только ссылка http://your.domen/index.php/welcome/index .

  • Глобальные настройки ядра Kohana Kohana_Core и Bootstrap.
    • Чтобы убрать (спрятать) index.php в Что такое ссылка URL нужно в массиве инициализации ключу index_file присвоить значение FALSE и включить правила для Как включить mod_rewrite? в файле .htaccess. В конфигурационном файле нашего приложения bootstrap.php допишем эту строку
      Kohana::init(array(
      	'base_url'   => '/',
              'index_file'   => FALSE,
      ));
  • Для кеширования роутов их нужно поместить в конструкцию If перед методом Route::cache(TRUE);. Если всё сделано правильно, то сгенерированный кеш будет находится в папке application/cache/.
    if (!Route::cache()) {
    // Set routes here
        Route::cache(TRUE);
    }
  • Валидация находится в классе Valid (valid.php)
  • Произвести очистку всех элементов массива $_POST от пробелов в начале и в конце
    $_POST = Arr::map('trim', $_POST);
  • Методы before() и after() вызываются соответственно до и после вызова action в контроллере, если нужно произвести какие-либо манипуляции с данными. Обязательно в методе before сначала вызывается родительский before, а потом уже манипуляции с нашими данными, в методе after сначала работа с данными, потом вызов родительского after.
  • Вынести все роуты в отдельный файл из bootstrap.php. Создадим в папке application новый файл routes.php и переносем в него весь Route::set('default')… А на его месте в bootstrap.php подключем файл
    // External routes
    require_once APPPATH . 'routes' . EXT;
  • Ошибка Kohana_Exception [ 0 ]: Database method list_columns is not supported by Kohana_Database_PDO говорит о том, что модуль ORM не может получить при помощи PDO PHP список полей таблицы. Структура таблиц хранится в переменной $_table_columns и загружается при каждом выполнении скрипта. Для устранения ошибки достаточно вручную заполнить свойство $_table_columns в используемой модели. Например, для модуля auth переопределим модель Model_User, которая использует таблицу users (Model_Role соответственно таблица role)
    <?php defined('SYSPATH') OR die('No direct access allowed.');
    
    class Model_User extends Model_Auth_User {
    
    
        protected $_table_columns = array(
            'id' => NULL,
            'email' => NULL,
            'username' => NULL,
            'password' => NULL,
            'logins' => NULL,
            'last_login' => NULL,
        );
    }    
    // End User Model

    или переопределить функцию list_columns

    <?php
    
    defined('SYSPATH') OR die('No direct script access.');
    
    class ORM extends Kohana_ORM {
    
        /**
         * Proxy method to Database list_columns.
         *
         * @return array
         */
        public function list_columns() {
            switch ($this->_table_name) {
                case 'users':
                    return array(
                        'id' => NULL,
                        'email' => NULL,
                        'username' => NULL,
                        'password' => NULL,
                        'logins' => NULL,
                        'last_login' => NULL,
                    );
    
                    break;
                case 'roles':
                    return array(
                        'id' => NULL,
                        'name' => NULL,
                        'description' => NULL,
                    );
                    break;
                case 'roles_users':
                    return array(
                        'user_id' => NULL,
                        'role_id' => NULL,
                    );
    
                    break;
                case 'user_tokens':
                    return array(
                        'id' => NULL,
                        'user_id' => NULL,
                        'user_agent' => NULL,
                        'token' => NULL,
                        'created' => NULL,
                        'expires' => NULL,
                    );
                    break;
                default:
                    return array();
                    break;
            }
        }
    
    }
    
  • Передача параметров в действие(action) контроллера.
    Route::set('grammar', 'grammar/<grpage>', array('grpage' => '.+'))
            ->defaults(array(
                'controller' => 'grammar',
                'action' => 'index',
            ));
        public function action_index() {
            $output = $this->request->param('grpage', 0);
    
            //...

Объекты Request, Response, GET, POST

Объект Request - один из основных элементов ядра фреймворка. В Kohana 3.2 он выполняет следующие задачи:

  • Подготовка запроса. Обработка исходных данных: IP клиента, заголовки браузера (User_Agent), используемый HTTP-метод запроса (GET/POST/PUT/DELETE), и т.д. Все эти данные передаются в созданный экземпляр класса Request. Таким образом, у каждого объекта создается свое окружение
  • Поиск маршрута, подходящего под URI запроса
  • Запустить необходимый контроллер на выполнение
  • Получить от контроллера ответ и сохранить его в виде экземпляра класса Response.

По сути, объект Request выполняет контроль над выполнением приложения, от получения клиентских данных до генерации сервером ответа.

  • В Kohana v3.1+ Класс Request имеет методы query() и post() для обработки GET и POST запросов соответственно. Они работают в обе стороны и для получения и для установки:
    // get $_POST data
    $data = $this->request->post();
    // returns $_GET['foo'] or NULL if not exists
    $foo = $this->request->query('foo'); 
    
    // set $_POST['foo'] value for the executing request
    $request->post('foo', 'bar');
    // or put array of vars. All existing data will be deleted!
    $request->query(array('foo' => 'bar'));

    Нужно помнить что установка GET/POST данные не переписывает текущих$_GET/$_POST значений, для отсылки нужно использовать вызов $request→execute(),например как в примере ниже.

  • Пример. Получить содержимое удаленной Веб- страницы в переменную. Аналогично можно обращаться к локальным (собственным) контроллерам
     public function action_index() {
            $result = Request::factory('http://news.kh.ua')->execute();
            $this->response->body($result);
        }

Объект Validation

Объект класса Validation служит для проверки данных полученных от пользователя, например при помощи HTTP Метод HTTP POST запроса.

Хелперы

Хелперы (Helpers — помощники) - вспомогательные функции доступные в любом месте приложения на Kohana.

Класс HTML:

  • Подключить стили и скрипты
    <?= HTML::style('css/grid.css'); ?>
    <?= HTML::script('js/content.js'); ?>
  • HTML- ссылки: HTML::anchor ($uri — адрес ссылки, $title — текст ссылки, Массив $array — (не обязательный параметр) атрибуты, по умолчанию null, $protocol - (не обязательный параметр) специфический протокол, по умолчанию null) — служит для задания ссылки.:
    <?= HTML::anchor('user/profile', 'Профиль') ?>
    <?php echo HTML::anchor('/user/profile', 'My Profile',array('rel'=>'nofollow',));?>
  • Ссылка на файл:
    echo HTML::file_anchor('media/doc/user_guide.pdf', 'User Guide');
  • Изображение:
    echo HTML::image('media/img/logo.png', array('alt' => 'My Company'));
  • Формирует email адрес для борьбы со спам-ботами:
    echo HTML::email($address);
  • Атрибуты HTML: HTML::attributes(array $attrs — не обязательный параметр) — служит для задания атрибутов для HTML тегов. Например, мы хотим записать
    <div id=”content”></div>
    <?php echo “<div”.HTML::attributes(array(‘id’=>’content’).”></div>” ?>

Класс Form:

  • Открытие и закрытие формы:
    echo Form::open(‘search', array('method' => ‘get'));
    echo Form::close();
  • Создать две радиокнопки
    <?= Form::radio('name', 1, TRUE);?>Строка
    <?= Form::radio('name', 2, FALSE);?>Столбец

Модули

Универсальный git репозитарий для Kohana - содержит ссылки на актуальные репозитории со сторонними модулями и ядром системы.

  • kohana_calendar: активировать через bootstrap.php
    Kohana::modules(array(
    ...
        'calendar' => MODPATH . 'kohana_calendar', // https://github.com/samwilson/kohana_calendar
    ...

    Копируем файл kohana_calendar/views/calendar.php в директорию application/views/ В контроллере запускаем так

    $cal = new Calendar(1,2008); // January, 2008. The default is current month and year
    $cal->render(); // the view is automatically rendered from the library

Настройка Kohana 3.3.0 для работы с базой данный Использование и настройка PostgreSQL c использованием технологии PDO PHP.

  • Для подключения модуля нужно раскомментировать строчку с его названием в файле bootstrap.php:
    Kohana::modules(array(
    ...
         'database'   => MODPATH.'database',   // Database access
    ...
    ));
  • Файл database.php копируем из «modules/database/config/» в «application/config/».
  • Редактируем файл «application/config/database.php»
    <?php
    
    defined('SYSPATH') OR die('No direct access allowed.');
    
    return array
        (
        'default' => array(
            'type' => 'pdo',
            'connection' => array(
                'dsn' => 'pgsql:host=localhost;dbname=mydb',
                'username' => 'user',
                'password' => 'your_password',
                'persistent' => FALSE,
            ),
            /**
             * string   identifier  set the escaping identifier
             */
            'table_prefix' => '',
            'charset' => 'utf8',
            'caching' => FALSE,
            'profiling' => TRUE,
    //        'identifier' => '"', /*для версии PostgreSQL => 9.1*/
        )
    );
Обязательно укажите строку 'identifier' ⇒ '"', если вы используете PDO PHP, ORM и Использование и настройка PostgreSQL версии >= 9.1, в связи с изменением Lexical Structure. В противном случае будет возникать ошибка: Database_Exception [ 42601 ]: SQLSTATE[42601]: Syntax error: 7 ERROR: syntax error at or near "."

Модуль Auth. При использование ORM роль Login должна быть назначена всем без исключения пользователям иначе авторизация не пройдет (это требование можно использовать для блокировки пользователя).

  • Для получения информации о текущем пользователе используется метод get_user($default), где $default — необязательный параметр, который будет возвращен, если авторизация не выполнена. Пример, для избежания ошибки ErrorException [ Fatal Error ]: Cannot use object of type Model_User as array нужно значения возварашаемые методом get_user()→ явно приводить к массиву as_array()):
    if (Auth::instance()->logged_in()) {
           $user = Auth::instance()->get_user()->as_array();
           echo 'Hello, ' . $user['username'];
    }

    или же использовать обращение к объекту

    echo 'Hello, ' . $user->username;
  • Модуль Captcha и Kohana 3.3.0

Класс i18n Интернационализация. В Kohana существует функция

__()

для перевода небольших объемов текста. Например, предварительно в каталоге application/i18n/ должны быть созданы и заполнены файлы переводов en.php, ru.php, uk.php

        <!--Russian-->
        <?php I18n::lang('ru');
        echo __('message');?>
        <!--English-->
        <?php I18n::lang('en');
        echo __('message');?>
        <!--Ukrainian-->
        <?php I18n::lang('uk');
        echo __('message');?>

В версии Kohana 3.2 для перенаправления использовался метод объекта Request→redirect(), в версии выше этот функционал перенесен в класс HTTP.

  • Перенаправить на внешний ресурс HTTP::redirect('http://news.kh.ua');
  • Перенаправить на локальный контроллер HTTP::redirect('admin');

Kohana и 404 Not Found

В Kohana можно использовать свой обработчик Коды состояния HTTP. Методы и структура протокола HTTP ошибок. Создадим обработчик самой распространенной ошибки HTTP 404 Not Found. И укажем ему срабатывать только если переменная Kohana::$environment равна константе PRODUCTION, в любом другом случае запускать системный обработчик ошибок.

  1. Переопределяем переменную Kohana::$environment(по умолчанию значение DEVELOPMENT) при помощи файле Настройка .htaccess, дописав в него строку
    SetEnv KOHANA_ENV PRODUCTION

    Вместо .htaccess можно переопределять непосрдственно в bootstrap.php.

  2. Создаем два файла для обработки 404 ошибки application/classes/HTTP/Exception/404.php и application/views/Errors/404.php. Route::set создавать не надо.
    $ nano application/classes/HTTP/Exception/404.php
    <?php defined('SYSPATH') OR die('No direct script access.');
    
    class HTTP_Exception_404 extends Kohana_HTTP_Exception_404 {
    
        public function get_response() {
            // Lets log the Exception, Just in case it's important!
            Kohana_Exception::log($this);
    
            if (Kohana::$environment >= Kohana::DEVELOPMENT) {
                // Show the normal Kohana error page.
                return parent::get_response();
            } else {
    
                $view = View::factory('Errors/404');
    
                // Remembering that `$this` is an instance of HTTP_Exception_404
                $view->message = $this->getMessage();
    
                $response = Response::factory()
                        ->status(404)
                        ->body($view->render());
    
                return $response;
            }
        }
    
    }
    $ nano application/views/Errors/404.php
    <br />
    <h2>404 Not Found</h2>
    <br />
    <?= $message ?>
    <br />
  • Вызвать 404 ошибку можно самостоятельно:
    throw new HTTP_Exception_404('File not found');

Kohana подключение своих функций

Иногда возникает потребность подключить(автоподключить) свои функции к Kohana. Наиболее оптимальный и правильный способ это оформить свои пользовательские функции в виде статических методов класса и использовать автоматический загрузчик Kohana. Например, создадим класс DFunction в файле DFunction.php

<?php
class DFunction {

    static function detectlanguage() {
        $langcode = explode(";", $_SERVER['HTTP_ACCEPT_LANGUAGE']);
        $langcode = explode(",", $langcode['0']);
        return $langcode['0'];

        /* Example for use
         * $language = DFunction::detectlanguage();
         * echo "You have chosen $language as your language in your web browser.";
         */
    }

}

Чтобы класс подключился автоматически в ядро Kohana - файл DFunction.php должен находиться в директории classes (допускается использовать поддиректории, но в этом случае нужно поменять соответственно имя класса),

PQ VPS сервера в 28+ странах.