- Существует такой полезный метод
Route::matches
. Он позволяет протестировать конкретный УРЛ на конкретном роуте. В Kohana 3.3 его синтаксис изменился, теперь нельзя просто передать в него строковый УРЛ. Метод ожидает целый объектRequest
.// в 3.2 $params = Route::get('routename')->matches('foo/bar'); // в 3.3 $params = Route::get('routename') ->matches(Request::factory('foo/bar'));
Такое изменение связано с появлением фильтров. Если к проверяемому маршруту привязаны фильтры, то в них необходимо передать объект
Request
. - Далеко не все запросы можно осуществить с помощью Query Builder‘а, и тогда
DB::query()
в помощь. Но что делать, если полученные данные хочется видеть в формате модели ORM? Все просто — укажите возвращаемый тип данных для объекта Database_Result:DB::query(...) ->as_object('Model_User') ->execute();
-
Метод
Form::select()
генерирует списки (так называемыеdropdowns
) с помощью тэговSELECT
/OPTION
. Чтобы создать список с множественным выбором (multiple dropdown
), просто передайте текущее значение (третий параметр метода) в виде массива. Если текущее значение не выбрано, то пустой массив. Хэлпер сам добавит свойствоmultiple
. Не забудьте явно указать в имени элемента квадратные скобки:// вывод списка стран с возможностью множественного выбора form::select('countries[]', $countries, (array)$selected_countries);
- Про метод
Arr::path($array, $path, $default, $delimiter)
писали неоднократно. Он принимает на входе$path
, в который можно писать путь к нужному значению в виде строки (в том числе и с wildcards). Но иногда бывают случаи, когда ключи в массиве могут содержать точку. И даже если используется другой$delimiter
, теоретически строковый ключ может с ним пересекаться, и тогда путь создастся некорректный. Для того, чтобы явно управлять путями, поддерживается работа с$path
в виде готового массива:$kohana_versions = array( '3.0' => array( 'date' => '2009-09-17', 'name' => 'renaissance', ), '3.1' => array( 'date' => '2011-02-07', 'name' => 'merle', ), '3.2' => array( 'date' => '2011-07-24', 'name' => 'Kolibri', ), '3.3' => array( 'date' => '2012-10-23', 'name' => 'badius', ), ); // вариант с использованием строкового пути $releases = Arr::path($kohana_versions, '*.name'); // то же самое, но надежнее $releases = Arr::path($kohana_versions, array('*', 'name'));
На всякий случай напомню, что wildcards не могут быть использованы для обозначения части ключа. Например,
array('3.*', 'name')
использовать не получится. -
Раз уж я упомянул о wildcards в
Arr::path()
, на всякий случай упомяну, что Kohana::$config->load() тоже работает через этот хэлпер, а значит в нем тоже можно использовать маски:// собираем все настройки подключений из конфига database $connections = Kohana::$config->load('database.*.connection'); // wildcards можно использовать неоднократно $passwords = Kohana::$config->load('database.*.*.password');
Главное — помнить, что одна «звездочка» обозначает ровно один уровень вложенности.
- Kohana позволяет отдавать пользователю файлы с помощью метода
Response::send_file($filename, $download, array $options)
. Чтобы вместо скачивания браузер отображал содержимое файла (картинки, js/css и тд), в массиве$options
надо передавать ключ ‘inline’. В этом случае Kohana сгенерирует заголовокContent-Disposition: inline;
и браузер попытается отобразить содержимое на экране. -
При работе с модулем Database часто результат выборок возвращается в виде объекта
Database_Result
. Он всем хорош — и ведет себя как обычный массив, и данные возвращает как захочешь (можно массивом, можно объектами). Одна беда — нельзя его в кеш положить в таком виде, так как он содержит ресурс, который невозможно будет восстановить из кеша. Впрочем, разработчики предусмотрели это, и создали специальный классDatabase_Result_Cached
:// получаем Database_Result $result = DB::query(Database::SELECT, 'select * from users')->execute(); // а чтобы закешировать - запрашиваем Database_Result_Cached $cached_result = $result->cached(); // все, можно сохранять в кеш или сессию! Cache::instance()->set('all_users', $cached_result);
В дальнейшем, при разворачивании данного объекта из кеша, можно будет пользоваться всеми теми же плюсами
Database_Result
.Для PDO-запросов такой проблемы нет, возвращается сразу
Database_Result_Cached
. Но специально проверять тип объекта не стоит, так как методcached()
у него просто вернет тот же объект.
Свежие записи
Метки
acl
auth
cache
captcha
CMS
css
database
db
docs
github
helpers
hooks
i18n
jelly
ko3
Kohana
Kohana3
kohana 3.2
kohana 3.3
locale
modules
oauth
ORM
php
relations
router3
routing
session
sprig
tutorials
uri
userguide
validation
версии
версии
заметки
знаете ли вы
мануал
модули
модули
напильник
редирект
релизы
с праздником!
учебник
Слух, а что в 3.4 появится и появится ли вообще?
Эм… Мне не докладывали пока что
Разработчики обязались сперва добить долги (то бишь закрыть тикеты по ближайшей 3.3.x), и только потом спокойно приступать к 3.4. Так как времени у них и на это не особо много, народ потихоньку организуется в банды и планирует помочь всем миром
Ясно… Ну пока ждем, потестирую что еще есть)
@biakoveron,
В случае возвращения as_object(), должен ли возвращаемый объект наследоваться от Database_Result или может ли?
Или от какого класса правильно наследовать, чтобы получить возможности Database_Result?
Можно ли как-то из ORM вернуть не Database_Result, а свой тип? Не вижу такой возможности..
> Или от какого класса правильно наследовать, чтобы получить возможности Database_Result?
Это вообще может быть любой объект. Он подкладывается в функцию mysql_fetch_object() (для MySQL, в случае с PDO выставляется FetchMode=PDO::FETCH_CLASS). Обычно это модель. Смысла наследоваться от Database_Result нет, так как это по сути ООП-обертка вокруг массива, а настройка через as_object() нужна для управления типом данных, возвращаемых этим массивом
> Можно ли как-то из ORM вернуть не Database_Result, а свой тип? Не вижу такой возможности..
А чего ты хочешь добиться, для начала?
По ходу с закрытием фреймворка блог больше не ведется. Чем теперь занимаешься, biakaveron?
На самом деле я начал потихоньку «филонить» еще раньше. Практически не программирую с переходом в руководящую должность, так что и писать в общем-то не о чем.
PS. Фреймворк пару дней назад выпустил обновление 3.3.3.1, если что