Вдохновленный другими вики сообществами, мне интересно узнать о менее известных советах, трюках и особенностях Kohana.
- Пожалуйста, укажите только один отзыв для каждого ответа.
- При необходимости добавьте версии Kohana.
Это сообщество wiki.
Вдохновленный другими вики сообществами, мне интересно узнать о менее известных советах, трюках и особенностях Kohana.
Это сообщество wiki.
$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);
echo Database::instance()->last_query
Взято из В Kohana 3, как вы определяете ошибки, сделанные во время запроса?.
Вставьте эти строки в свой .htaccess
:
SetEnvIf SERVER_ADDR "^(127\.0\.0\.1|::1)$" KOHANA_ENV=development
SetEnvIf SERVER_ADDR "^((?!127\.0\.0\.1|::1).)*$" KOHANA_ENV=production
теперь, если вы находитесь на локальном хосте, вы находитесь в режиме разработки, иначе вы находитесь в рабочем режиме
Изменить: Добавлена поддержка IPv6
Функция ORMs add
принимает третий параметр, в котором вы можете указать дополнительные данные для сохранения в таблице 1pivot1.
Например, если у пользователя много ролей, а у роли много пользователей (через таблицу с именем 1roles_users1), вы можете сохранить информацию в таблице 1pivot1, передав массив ключей столбцов и значений данных в качестве третьего аргумента add
.
Не поддерживается. Альтернативой было бы загрузить pivot table
и добавить данные так же, как и с любой другой таблицей.
$user->add('role', $role, array('date_role_added' => time()));
где $role
- ORM::factory('role', array('name' => 'user'));
Разница между 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.
Эти примеры кода предполагают, что вы расширяетесь от контроллера шаблона.
public function before()
{
parent::before();
if (Request::current()->is_ajax())
{
$this->auto_render = FALSE;
}
}
public function before()
{
parent::before();
if (Request::$is_ajax)
{
$this->auto_render = FALSE;
}
}
Вместо привязки привязки hardcoding в вашем HTML и PHP, это хорошая идея, чтобы отменить маршрутизацию. Это по сути означает, что вы определяете местоположения маршрутов, а затем используйте их; Если вам когда-либо понадобится изменить местоположение, которое оно сделало в одном месте, а не сотни.
Маршруты могут быть определены где угодно, но рекомендуется использовать их в загрузочном буфере приложения или в загрузочных модулях (init.php).
Они устанавливаются следующим образом:
Route::set('name', '<controller>(/<action>)', array('action' => 'login|logout');
<part>
.Когда часть окружена скобками, эта часть является необязательной. Если пользователь не предоставил часть и вы хотите указать значение по умолчанию, используйте метод по умолчанию для указания значений.
->defaults(array('action' => 'login'));
Следующий код теперь используется для реверсивных маршрутов. URL-адрес может быть обновлен, и все ваши URL-адреса должны работать по-прежнему.
Route::url('name', array('controller' => 'user', 'action' => 'login'));
Они известны как суб-запросы. Взгляните на статью Сэма де Фрейсинеса: Масштабирование веб-приложений с помощью HMVC для более глубокого объяснения. Обратите внимание на исходную разницу между экземплярами vs.
if (Request::initial() !== Request::current())
{
print 'Internal called made with Request::factory';
}
if (Request::instance() !== Request::current())
{
print 'Internal called made with Request::factory';
}
Установите 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)
Эта функция проверяет как внутренние, так и 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. Вам нужно, чтобы переключатель отображал реальную ошибку в разработке.
throw new HTTP_Exception_404('The article :article was not found',
array(':article' => $article->name));
Второй аргумент предоставляет вам возможность заменить строки в сообщении об ошибке.
Не содержит HTTP-исключений. Вы должны создавать свои собственные исключения и обрабатывать их. В Kohana есть учебник для этого: Kohana - пользовательские страницы ошибок
Чтобы выполнить SQL-запрос типа TRUNCATE mytable
с подготовленными инструкциями, передайте null
в качестве первого параметра для метода DB::query()
. Полезно, когда запрос не подходит для любых операций CRUD.