Любимые советы и характеристики 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');
- Название маршрута
- Путь к URL для сопоставления.
- Регулярное выражение для ограничения того, что
<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.