Контент


ORM v3.0: что будет?

Не так давно разработчик jheathco опубликовал коммит со множеством важных изменений в механизме ORM. Одно из самых главных — отказ от свойств $has_and_belongs_to_many и $has_many_through. И если $has_many_through может быть использован через $has_many (с указанием имени промежуточной модели в качестве дополнительного параметра), то HABTM в чистом виде нам недоступен. Честно говоря, не самое однозначное решение — минусы очевидны.

Кроме того, практически завязанный на ORM модуль Auth также «подвисает». Включенная в RC3 версия как таковая непригодна к использованию (интересно, зачем Shadowhand вообще добавил его, зная об этом?). Сейчас имеется более-менее работоспособная версия на гитхабе, однако для вместе с ней придется подключать альтернативную версию ORM (это форк от оригинальной, однако сделаны некоторые необходимые изменения, убирающие известные баги). Основные методы (login/logout, «запоминание» пользователя при логине) должны работать.

В ожидании релиза 3.0 не самые радужные перспективы… Будем ждать стабильности в двух популярных модулях.

PS. Кстати, чем радует версия jheathco — наличие описания на вики-странице проекта.

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.

Теги: , , , .


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

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

  1. sergkarpenko пишет:

    Как то сыровато ko3, хотя уже релиз кандидат 3 :( . Захотелось попробовать на мелком сайте ko3. Так как проект мелкий и собственный, то сырость и отсутствие документации не пугает. В конфиге к бд обнаружил alternate с примером для PDO, настроил — получил exception от Kohana_PDO_mysql о неподдерживаемости list_tables. Не беда вернул mysql. Дальше нашел что теперь есть новый ORM Valiadation c _rules, _filters и тп. Правда ссылку на вики страницу нашел уже позже у Вас на сайте, но порассматривав код написал
    class Model_Order extends ORM
    {
    protected $_rules = array(
    ‘person’ => array(‘not_empty’ => NULL),
    ‘content’ => array(‘not_empty’ => NULL)
    );
    }
    Дальше
    $order = ORM::factory(‘order’);
    $order->values($_POST);
    $order->check();
    И тут сюрприз, Validate внутри ОРМа, а ошибки у него попросить забыли, пока все что есть это валидно/ валидно. Тоже не беда. Переписал на
    $validation = Validate::factory($_POST)
    ->rule(‘person’, ‘not_empty’)
    ->rule(‘content’, ‘not_empty’)
    ->filter(TRUE, ‘trim’);
    if ($validation->check())
    {
    $order = ORM::factory(‘order’);
    $order->person = $validation->person;
    $order->content = $validation->content;
    $order->save();
    }
    else
    {
    var_dump($validation->errors(‘form’));exit;
    }
    (Дальше не про ОРМ, но все же.. )
    Перед этим долго искал куда засунули $this->input->post()
    Оказалось что его просто заменили на проход циклом по всем входным переменным с применением к ним Kohana::sanitize(), xss нашел в Kohana_security, и применять ее к приехавшим входным значениям получается нужно самостоятельно.

    Захотелось ошибки русифицировать, ну и локаль для приличия включить русскую. Тоже тут все поменялось. locale.php отсутствует. поиск по проекту на тему setlocale ничего не дал. опять пришлось смотреть на код — судя по всему предполагается в бутстрап добавлять
    I18n::$lang = ‘ru-ru’;
    setlocale(LC_ALL, ‘ru_UK.UTF-8′);
    плюс ко всему добавив файлик /i18n/ru/ru.php или /i18n/ru.php со строками
    return array (
    ‘:field must not be empty’ => ‘Поле «:field» не должно быть пустым’,
    );
    Получил таки локализацию сообщений. Смысла в // Add the non-specific language strings и // Add the locale-specific language strings особого не увидел :(

    Роуты тоже стали загадочные, не похожи ни на старые, ни на ЗФ, ни на симфони. минут 20 пытался сделать из /index/about => /about
    Все оказалось банально совсем
    Route::set(‘about’, ‘(about)’ )
    ->defaults(array(
    ‘controller’ => ‘index’,
    ‘action’ => ‘about’));
    Работает, хотя кажется мне что какой то роут не правильный идеологически.

    Осталось еще попробовать работу связей в ORM…

    Пока процесс разработки на ко3 довольно мучительный получается и тянет много времени..
    Рыться у них на форуме, читать их редмайн, а также вики и коментарии на гитхабе в поисках описания работы (или не работы ) тех или иных частей не очень радужно :(
    Вывод пока для меня следующий — на работе сидим на 2.3.4 и не рыпаемся. Хотя хочется именованый биндинг параметров, подзапросы в билдере, лейзи лоад в ОРМ ну и еще что то. уже не помню чего должно быть, но вроде еще много всего

  2. sergkarpenko пишет:

    сорри, какой то длинный коментарий получился, увлекся что-то

  3. BIakaVeron пишет:

    1. Для получения ошибок в orm есть метод errors(). А руссификацию валидации лучше через messages делать, а не через i18n.
    2. Маршрут не такой уж неправильный, если его немного изменить:

    Route::set(’short’, ‘’ )
    ->defaults(array(
    ‘controller’ => ‘index’,
    ‘action’ => ‘(about|contact|copyright)’));

    т.е. создавать отдельный роут для каждого экшена не надо, а вот выделить методы одного (дефолтного) контроллера в специальный роут и вызывать их без указания контроллера — запросто.
    3. XSS можно применять в правилах валидации для модели.

  4. Xobb пишет:

    Тоже попробовал ko3. Прикрутил уже Doctrine, ko3orm не самый удачныйб ИМХО.

    С роутами проблемы, просифонил тему на форуме о них и не нашел адекватной документации. Говорят, что дока уже готова к релизу, а вот ссылку на нее у никого нет.

    Input — костыль, имхо, так что правильно с ним поступили.

  5. BIakaVeron пишет:

    По поводу Doctrine — было бы интересно почитать…
    А что за проблемы с роутами? Сильно глубоко не копал, но выглядит все пока логично.

  6. Xobb пишет:

    С Doctrine довольно просто. в init.php модуля doctrine конфигурируем приблизительно так:


    require Kohana::find_file('classes', 'doctrine/Doctrine');
    spl_autoload_register(array('Doctrine', 'autoload'));

    $db = Kohana::config('database')->doctrine;

    $manager = Doctrine_Manager::getInstance();
    $manager->connection('mysql://'.$db['user'].':'.$db['password'].'@'.$db['host'].'/'.$db['database'], 'default_connection');
    $manager->setAttribute(Doctrine::ATTR_MODEL_LOADING, Doctrine::MODEL_LOADING_CONSERVATIVE);
    $manager->setAttribute(Doctrine::ATTR_VALIDATE, Doctrine::VALIDATE_ALL);
    $manager->setAttribute(Doctrine::ATTR_DEFAULT_IDENTIFIER_OPTIONS, array('name' => '%s_id', 'type' => 'int', 'length' => 11));
    $manager->setAttribute(Doctrine::ATTR_PORTABILITY, Doctrine::PORTABILITY_ALL);
    $manager->setAttribute(Doctrine::ATTR_QUOTE_IDENTIFIER, true);
    $manager->setAttribute(Doctrine::ATTR_EXPORT, Doctrine::EXPORT_ALL);
    $manager->setAttribute(Doctrine::ATTR_TBLNAME_FORMAT, $db['prefix'].'_%s');
    $manager->setAttribute(Doctrine::ATTR_AUTOLOAD_TABLE_CLASSES, true);
    Doctrine::loadModels(APPPATH.'models');

    Вот и все. Обратите внимание, что doctrine модели будут не в application/classes/model/ а в application/models/. Так же появляются папки для схем yaml, дампов, diff и т.д. базы даных. Тема стоит отдельного поста.

  7. BIakaVeron пишет:

    Тема стоит отдельного поста

    Я собственно на это и намекал, т.к. в личном блоге ничего подобного не увидел ;)

  8. Xobb пишет:

    Исправился. Всего ничего делать. Может на хабр вместе переведем, у меня русский хромает? :)

  9. BIakaVeron пишет:

    Если есть вариант перевода, присылай на почту, поправлю если что.

  10. Random пишет:

    @BIakaVeron:
    > Для получения ошибок в orm есть метод errors()
    Похоже, что в финальном релизе KO3 данного метода в ORM нет. Kohana выдает ошибку: Kohana_Exception [ 0 ]: Invalid method errors called in Model_Category.
    Так как же получить ошибки валидации из модели?

  11. BIakaVeron пишет:

    Да, к сожалению наши предложения о добавлении данного метода не были поддержаны. Добраться до объекта Validate можно с помощью метода validate(), стало быть ошибки получим в результате $user->validate()->errors().

  12. Konstantin пишет:

    Тоесть получается, что в данной версии присутствуют два способа валидации, в модели и так сказать как было раньше?

    Допустим я получаю данные из формы, нужно их проверить:

    $data = Validate::factory($_POST);
    $data->filters( … , … );
    $data->rules( … , … );

    $data->check();

    $errors = array();
    $errors = $data->validate()->errors(); // ???

    получаю ошибку «Call to undefined method Validate::validate()»

    ——

    $data->errors(); вроде выдает нечто похожее судя по, однако при попытке передать его в view:

    $this->template->content = View::factory(‘page_add’)
    ->set(‘errors’, $data->errors())
    ->set(‘form’, $form);

    Получаю ErrorException [ Warning ]: htmlspecialchars() expects parameter 1 to be string, array given…

  13. BIakaVeron пишет:

    Метод validate() относится только к ORM — это способ получить вложенный объект Validate модели. В случае ручного формирования валидатора просто последовательно вызываются методы check() и errors().
    В Ko3 метод errors() работает нормально, подобных ошибок не видел. Напишите мне на почту, какие вызовы используете (код контроллера, модели), что возвращается и т.д.



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

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