Любимые советы и характеристики Kohana?

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

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

Это вики сообщества.

12 ответов

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

Кохана 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.1 и 3.0

echo Database::instance()->last_query

Взято из In Kohana 3, как вы обнаруживаете ошибки, допущенные во время запроса?,

Set 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

Разница между this->request->route->uri() а также this->request->uri() (Кохана 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 равен нулю), а $this->request->uri() применяет текущие сегменты uri.

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

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

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

Кохана 3.1

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

Кохана 3.0

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

где $role является ORM::factory('role', array('name' => 'user'));

Отключить автоматическую визуализацию для запросов AJAX

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

Кохана 3.1

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

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

Кохана 3.0

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

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

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

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

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

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

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

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

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

Кохана 3.1 и 3.0

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

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

Задавать 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)

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

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

Кохана 3.1

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

Кохана 3.0

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

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());
}

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

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

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

Кохана 3.1

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

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

Кохана 3.0

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

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

Другие вопросы по тегам