Любимые советы и возможности Kohana?

Вдохновленный другими вики сообществами, мне интересно узнать о менее известных советах, трюках и особенностях Kohana.

  • Пожалуйста, укажите только один отзыв для каждого ответа.
  • При необходимости добавьте версии Kohana.

Это сообщество wiki.

Ответ 1

Создание формы:: select() из результата базы данных

Kohana 3.1 и 3.0

$options = ORM::factory('model')
 ->order_by('title','ASC')
 ->find_all()
 ->as_array('id','title');

$select = Form::select('name', $options);

Следует отметить, что это не ограничивается ORM и может использоваться для всех результатов базы данных (все они поддерживают as_array). Подробнее см. данные базы данных.

Если вы хотите добавить опцию по умолчанию:

$options = Arr::merge(array('Please select a value.'), $options);

Ответ 3

Установить Kohana:: $environment

Вставьте эти строки в свой .htaccess:

SetEnvIf SERVER_ADDR "^(127\.0\.0\.1|::1)$" KOHANA_ENV=development
SetEnvIf SERVER_ADDR "^((?!127\.0\.0\.1|::1).)*$" KOHANA_ENV=production

теперь, если вы находитесь на локальном хосте, вы находитесь в режиме разработки, иначе вы находитесь в рабочем режиме

Изменить: Добавлена ​​поддержка IPv6

Ответ 4

Добавление данных в сводные таблицы с использованием ORM

Функция ORMs add принимает третий параметр, в котором вы можете указать дополнительные данные для сохранения в таблице 1pivot1.

Например, если у пользователя много ролей, а у роли много пользователей (через таблицу с именем 1roles_users1), вы можете сохранить информацию в таблице 1pivot1, передав массив ключей столбцов и значений данных в качестве третьего аргумента add.

Kohana 3.1

Не поддерживается. Альтернативой было бы загрузить pivot table и добавить данные так же, как и с любой другой таблицей.

Kohana 3.0

$user->add('role', $role, array('date_role_added' => time()));

где $role - ORM::factory('role', array('name' => 'user'));

Ответ 5

Разница между this->request->route->uri() и this->request->uri() (Kohana 3)

// Current URI = welcome/test/5 
// Using default route ":controller/:action/:id"

// This returns "welcome/test/5"
echo $this->request->uri(); 

// This returns "welcome/test1/5"
echo $this->request->uri(array( 'action' => 'test1' )); 

// This returns "welcome/index"
echo $this->request->route->uri();

// This returns "welcome/test1"
echo $this->request->route->uri(array( 'action' => 'test1' ));

Как вы можете видеть, $this- > request- > route- > uri() использует текущие настройки по умолчанию (id равно null), а $this- > request- > uri() применяет текущие сегменты uri.

Ответ 6

Отключить автообновление для запросов AJAX

Эти примеры кода предполагают, что вы расширяетесь от контроллера шаблона.

Kohana 3.1

public function before()
{
    parent::before();

    if (Request::current()->is_ajax())
    {
      $this->auto_render = FALSE;
    }
}

Kohana 3.0

public function before()
{
    parent::before();

    if (Request::$is_ajax)
    {
      $this->auto_render = FALSE;
    }
}

Ответ 7

Поддерживаемые маршруты

Вместо привязки привязки hardcoding в вашем HTML и PHP, это хорошая идея, чтобы отменить маршрутизацию. Это по сути означает, что вы определяете местоположения маршрутов, а затем используйте их; Если вам когда-либо понадобится изменить местоположение, которое оно сделало в одном месте, а не сотни.

Маршруты могут быть определены где угодно, но рекомендуется использовать их в загрузочном буфере приложения или в загрузочных модулях (init.php).

Они устанавливаются следующим образом:

Route::set('name', '<controller>(/<action>)', array('action' => 'login|logout');
  • Название маршрута
  • URL-адрес для сопоставления.
  • Регулярное выражение для ограничения соответствия <part>.

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

->defaults(array('action' => 'login'));

Kohana 3.1 и 3.0

Следующий код теперь используется для реверсивных маршрутов. URL-адрес может быть обновлен, и все ваши URL-адреса должны работать по-прежнему.

Route::url('name', array('controller' => 'user', 'action' => 'login'));

Ответ 8

Проверка внутреннего запроса

Они известны как суб-запросы. Взгляните на статью Сэма де Фрейсинеса: Масштабирование веб-приложений с помощью HMVC для более глубокого объяснения. Обратите внимание на исходную разницу между экземплярами vs.

Kohana 3.1

if (Request::initial() !== Request::current())
{
    print 'Internal called made with Request::factory';
}

Kohana 3.0

if (Request::instance() !== Request::current())
{
    print 'Internal called made with Request::factory';
}

Ответ 9

Установите base_url автоматически:

Kohana::init(array(
    // ...
    'base_url' => dirname($_SERVER['SCRIPT_NAME']),
    // ...
));

Если ваш сайт размещен на уровне 1 и 1, вы должны использовать:

Kohana::init(array(
    // ...
    'base_url' => substr($_SERVER["SCRIPT_NAME"], 0, strpos($_SERVER["SCRIPT_NAME"], basename($_SERVER["SCRIPT_FILENAME"])));
    // ...
));

(взято из файла конфигурации Gallery3)

Ответ 10

HMVC + AJAX = is_remote()

Эта функция проверяет как внутренние, так и AJAX-запросы. Это может быть удобно, если некоторые части страницы изначально загружаются с использованием техники HMVC и могут быть перезагружены с помощью AJAX. Поместите его с некоторым базовым контроллером, из которого вы расширяете все свои правильные контроллеры (я называю это "базовым контроллером" ):

public function is_remote()
{
    if ($this->request->is_initial())
    {
        if ($this->request->is_ajax())
        {
            return TRUE;
        }
        else
        {
            return FALSE;
        }
    }
    else
    {
        return TRUE;
    }
}

Более короткий (эквивалентный) способ записи:

public function is_remote()
{
    return ( ! $this->request->is_initial() || $this->request->is_ajax());
}

Надеюсь, что это поможет.

Ответ 11

Отобразить страницу с ошибкой

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

Kohana 3.1

throw new HTTP_Exception_404('The article :article was not found', 
    array(':article' => $article->name));

Второй аргумент предоставляет вам возможность заменить строки в сообщении об ошибке.

Kohana 3.0

Не содержит HTTP-исключений. Вы должны создавать свои собственные исключения и обрабатывать их. В Kohana есть учебник для этого: Kohana - пользовательские страницы ошибок

Ответ 12

Чтобы выполнить SQL-запрос типа TRUNCATE mytable с подготовленными инструкциями, передайте null в качестве первого параметра для метода DB::query(). Полезно, когда запрос не подходит для любых операций CRUD.