Контент


Ko3: знаете ли вы? Часть 5

  1. Существует такой полезный метод 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.

  2. Далеко не все запросы можно осуществить с помощью Query Builder‘а, и тогда DB::query() в помощь. Но что делать, если полученные данные хочется видеть в формате модели ORM? Все просто — укажите возвращаемый тип данных для объекта Database_Result:

    DB::query(...)
        ->as_object('Model_User')
        ->execute();

  3. Метод Form::select() генерирует списки (так называемые dropdowns) с помощью тэгов SELECT/OPTION. Чтобы создать список с множественным выбором (multiple dropdown), просто передайте текущее значение (третий параметр метода) в виде массива. Если текущее значение не выбрано, то пустой массив. Хэлпер сам добавит свойство multiple. Не забудьте явно указать в имени элемента квадратные скобки:

    // вывод списка стран с возможностью множественного выбора
    form::select('countries[]', $countries, (array)$selected_countries);

  4. Про метод 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') использовать не получится.

  5. Раз уж я упомянул о wildcards в Arr::path(), на всякий случай упомяну, что Kohana::$config->load() тоже работает через этот хэлпер, а значит в нем тоже можно использовать маски:

    // собираем все настройки подключений из конфига database
    $connections = Kohana::$config->load('database.*.connection');
    // wildcards можно использовать неоднократно
    $passwords = Kohana::$config->load('database.*.*.password');

    Главное — помнить, что одна «звездочка» обозначает ровно один уровень вложенности.

  6. Kohana позволяет отдавать пользователю файлы с помощью метода Response::send_file($filename, $download, array $options). Чтобы вместо скачивания браузер отображал содержимое файла (картинки, js/css и тд), в массиве $options надо передавать ключ ‘inline’. В этом случае Kohana сгенерирует заголовок Content-Disposition: inline; и браузер попытается отобразить содержимое на экране.
  7. При работе с модулем 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() у него просто вернет тот же объект.

Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong

Опубликовано в Kohana3, знаете ли вы.

Теги: , , , .


Комментарии (8)

Будьте в курсе обсуждения, подпишитесь на RSS ленту комментариев к этой записи.

  1. aktuba пишет:

    Слух, а что в 3.4 появится и появится ли вообще?

  2. biakaveron пишет:

    Эм… Мне не докладывали пока что :)

    Разработчики обязались сперва добить долги (то бишь закрыть тикеты по ближайшей 3.3.x), и только потом спокойно приступать к 3.4. Так как времени у них и на это не особо много, народ потихоньку организуется в банды и планирует помочь всем миром :)

  3. aktuba пишет:

    Ясно… Ну пока ждем, потестирую что еще есть)

  4. seyfer пишет:

    @biakoveron,

    В случае возвращения as_object(), должен ли возвращаемый объект наследоваться от Database_Result или может ли?
    Или от какого класса правильно наследовать, чтобы получить возможности Database_Result?

  5. seyfer пишет:

    Можно ли как-то из ORM вернуть не Database_Result, а свой тип? Не вижу такой возможности..

  6. biakaveron пишет:

    > Или от какого класса правильно наследовать, чтобы получить возможности Database_Result?

    Это вообще может быть любой объект. Он подкладывается в функцию mysql_fetch_object() (для MySQL, в случае с PDO выставляется FetchMode=PDO::FETCH_CLASS). Обычно это модель. Смысла наследоваться от Database_Result нет, так как это по сути ООП-обертка вокруг массива, а настройка через as_object() нужна для управления типом данных, возвращаемых этим массивом

    > Можно ли как-то из ORM вернуть не Database_Result, а свой тип? Не вижу такой возможности..

    А чего ты хочешь добиться, для начала? :)

  7. seyfer пишет:

    По ходу с закрытием фреймворка блог больше не ведется. Чем теперь занимаешься, biakaveron?

  8. biakaveron пишет:

    На самом деле я начал потихоньку «филонить» еще раньше. Практически не программирую с переходом в руководящую должность, так что и писать в общем-то не о чем.

    PS. Фреймворк пару дней назад выпустил обновление 3.3.3.1, если что ;)



Можно включить подсветку кода: <code><pre lang="">...</pre></code>
Разрешены некоторые HTML теги

или используйте trackback.