<rmcreative>

RSS

Почему в Yii свой ActiveRecord

10 марта 2011

Казалось бы, зачем изобретать велосипед и писать свой Active Record, а не взять существующую реализацию… например, phpactiverecord, RedBeanPHP или тот же ORM Doctrine. В случае Yii всё не так однозначно:

  • AR в Yii старше большинства готовых решений. Первые версии были реализованы в 2005-м ещё в Prado. AR постоянно улучшался и затем перекочевал в Yii, где улучшения продолжаются и сейчас.
  • Свой AR даёт более «ровный» API.
  • Использование внешнего кода = потеря контроля качества реализации. В стороннем коде могут быть ошибки, которые по каким-либо причинам не смогут быстро исправить… а ведь AR — очень важная часть фреймворка.

Комментарии RSS

  1. №4058
    Роман
    Роман 10.03.2011, 9:43:14

    Свой велосипед всегда лучше, когда он уже есть, "отточен" и устраивает :)

  2. №4059
    tipugin
    tipugin 10.03.2011, 10:40:50

    Дайте пожалуйста еще тестовых классов. А то CDbTestCase прямо скажем неудобный для тестирования AR. Хотелось бы что-то вроде Shoulda (ror)

  3. №4060
    resurtm
    resurtm 10.03.2011, 10:46:23

    [offtopic]Александр! Как вы относитесь к идее добавить на сайте кнопки Facebook Like и Twitter tweet? Этот пост — ППКС, и хочется поделиться им с другими людьми.[/offtopic]

  4. №4061
    bettrrr
    bettrrr 10.03.2011, 13:00:47

    "Использование внешнего кода = потеря контроля качества реализации" Потеря чего????? Нам тут приходится иметь секс с YII не по нашей воле... Мы все просто в шоке от качества. Особенно от крутой расширяемости классов! Думаем заслать кого-нибудь в Японию или Китай и где там живёт ксуангксинг.

  5. №4062
    resurtm
    resurtm 10.03.2011, 13:09:11

    @bettrrr, патчей и конкретных предложений, я полагаю, от вас не ждать?

  6. №4063
    tipugin
    tipugin 10.03.2011, 13:10:52

    @bettrrr, меня в Yii все кроме php устраивает xD

  7. №4065
    Ekstazi
    Ekstazi 10.03.2011, 15:15:22

    Я думал это и так очевидно, но AR в yii еще есть куда расти.

  8. №4066
    Тормоз
    Тормоз 10.03.2011, 16:53:28

    Можете объяснить в нескольких словах - что такое ActiveRecord?

  9. №4067
    tipugin
    tipugin 10.03.2011, 17:00:38

    @Тормоз, это Yii-шный ORM - прослоечка для работы с бд.

  10. №4068
    Sam
    Sam 10.03.2011, 17:08:25

    tipugin, т.е. оно, как я понял, для тестирования набора валидаторов?

    resurtm, добавил.

    bettrrr, очень жду от вас баг-репортов и конкретных предложений. Можно в почту, можно сразу в трекер.

    Ekstazi, конечно есть. Со следующим релизом AR подрастёт хорошенько… код уже влит, осталось документацию написать.

    Тормоз, это класс.

    • Каждый его экземпляр соответствует одной записи таблицы.
    • При создании нового экземпляра, заполнении полей и вызове метода save (как правило) в таблицу добавляется новая запись.
    • При выборке получаем объект, наполненный данными из одной записи таблицы.
    • При изменении или удалении объекта изменяется или удаляется соответствующая ему запись.
  11. №4069
    tipugin
    tipugin 10.03.2011, 17:10:32

    @Sam, да, для валидаторов, отношений, поведения контроллеров и тп.

  12. №4070
    Тормоз
    Тормоз 10.03.2011, 17:22:21

    Спасибо, но почти ничего не понял :) Придётся почитать, для чего оно нужно.

  13. №4081
    Игорь
    Игорь 11.03.2011, 8:54:04

    tipugin, а как пользоваться DbTestCase?? Гугл об использовании такого класса не знает.....

  14. №4082
    tipugin
    tipugin 11.03.2011, 8:55:19
  15. №4085
    Игорь
    Игорь 11.03.2011, 12:49:36

    tipugin, благодарю, оплошал.

  16. №4086
    Andrey Gayvoronsky
    Andrey Gayvoronsky 11.03.2011, 13:23:40

    а мне вот интересно почему в yii до сих используется устаревший код для jquery, хотя сам использует последний jquery. Я про стандартные assets, все не проверял, но в autocomplete тянется куча барахла, которое уже устарело.

    jquery.ajaxqueue.js - устарело, можно реализовать средствами последних jquery

    jquery.dimensions.js - тоже устарело, вообще уже с версии jquery 1.2.6 встроен.

    Это так навскидку. Я понимаю, что это по-идее не много по размеру и количеству файлов, но все равно не помешало бы не только обновлять сам jquery, но и код поддерживать код в более актуальном состоянии. Это так...пожелания :) В данный момент, мне пришлось переделать widget autocomplete, чтобы избавиться от этого мусора из-за которого он у меня не работал.

  17. №4087
    Sam
    Sam 11.03.2011, 14:12:20

    Andrey Gayvoronsky, использовали CAutoComplete, который помечен как deprecated?

  18. №4089
    tipugin
    tipugin 11.03.2011, 14:21:55

    раз пошла такая пьянка, тогда реквестирую обновленные хелперы для CHtml, которые генерят инпуты с новыми html5 типами (email, url) и т.п.

  19. №4092
    Sam
    Sam 11.03.2011, 14:56:49

    @tipugin,

    CHtml::activeInputField('email', $model, 'email');
  20. №4093
    Andrey Gayvoronsky
    Andrey Gayvoronsky 11.03.2011, 15:06:48

    Sam, потому что использовать Jui нет желания вообще.

    Но если уж на то пошло, то он deprecated с 1.1.3, а там уже jQuery 1.4.2 используется(она вообще в yii c 1.1.2 используется) и это не было пофиксено еще с тех самых пор. Сейчас, конечно, можно сослаться на "deprecated", но это не отменяет актуальности того вопроса который я затронул - обновляются библиотеки, но не обновляется код.

    P.S.: в первом сообщении я привел пример и озвучил проблему актуальности кода. Это к вопросу:

    Использование внешнего кода = потеря контроля качества реализации. В стороннем коде могут быть ошибки, которые по каким-либо причинам не смогут быстро исправить… а ведь AR — очень важная часть фреймворка.

    Не более того.

  21. №4095
    Sam
    Sam 11.03.2011, 16:01:58

    @Andrey Gayvoronsky, так всё приведённое в пример как раз в CAutoComplete и используется. jQueryUI и свои компоненты из Zii регулярно обновляются.

  22. №4096
    Andrey Gayvoronsky
    Andrey Gayvoronsky 11.03.2011, 16:06:15

    да писал не об этом. а насчет zii - нет желания из-за одного autocomplete подключать весь jquery.ui

  23. №4247
    bettrrr
    bettrrr 30.03.2011, 12:35:44

    Вот какого хрена?

    protected function generateUniqueKey($key)
    {
        return md5($this->keyPrefix.$key);
    }

    а не:

    protected function generateUniqueKey($key)
    {
        return $this->keyPrefix.md5($key);
    }

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

  24. №4248
    bettrrr
    bettrrr 30.03.2011, 12:40:34
    class CHttpRequest extends CApplicationComponent
    {
    .....
        private $_requestUri;
        private $_pathInfo;
        private $_scriptFile;
        private $_scriptUrl;
        private $_hostInfo;
        private $_url;
        private $_baseUrl;
        private $_cookies;
        private $_preferredLanguage;
        private $_csrfToken;
    .......
    }

    А теперь давайте расширим этот класс! А вот х...!

  25. №4249
    Sam
    Sam 30.03.2011, 12:56:29

    bettrrr, какой смысл увеличивать длину ключа?

    Ну и в CHttpRequest есть геттеры для всех свойств, именно их и стоит перекрывать. private-переменные — это своего рода кеш и от открытия их лучше не станет.

  26. №4250
    bettrrr
    bettrrr 30.03.2011, 13:05:53

    CHttpSession.php

    if(ini_get('session.use_cookies')==='0')

    А что-же не из конфига то? Т.е. если несколько проектов, работает с одним окружением, то надо переобределять опцию конфига.

  27. №4251
    bettrrr
    bettrrr 30.03.2011, 13:08:03

    bettrrr, какой смысл увеличивать длину ключа?

    Это значительно уменьшит возможность совпадения md5. И даёт возможность чистить кеш по префиксу и анализировать его.

  28. №4252
    bettrrr
    bettrrr 30.03.2011, 13:13:19

    "Ну и в CHttpRequest есть геттеры для всех свойств." Эти свойства используются внутри методов класса. Мне надо переопределить один из методов. Геттеры и сеттеры не имеют доступа к прайват свойствам родителя.

    Пример: мне надо переопределить addCookie() в этом классе.

    HttpRequest extends CHttpRequest {
        protected function addCookie($cookie)
            {
                echo 1;
            }
    }

    ВОт это сделать не получится.

  29. №4253
    Sam
    Sam 30.03.2011, 15:22:20

    bettrrr, имея лишь часть ключа, насколько мне известно, ни один бэкенд кэша не позволит удалить по ней все ключи. Нужно знать точное имя. Про коллизии более весомый аргумент, но почему-то в трекере проекта этого ещё нет.

    Про CHttpSession и конфиг не понял.

    Геттеры и сеттеры не имеют доступа к прайват свойствам родителя.

    Но имеют доступ к геттерам родителя. Про addCookie, опять же, очень сферический пример. Расскажите, что именно нужно (на высоком уровне), я попробую расписать, как это сделать. Не получится — оформим как баг.

  30. №4255
    bettrrr
    bettrrr 30.03.2011, 17:45:35

    Из мемкеша например, в любом случае приходится тереть записи пробегая по ним. С префиксом это удобней. Иногда надо стереть весь кеш, но на одном сервере несколько проектов, с именованием ключей в md5, не получится удалить весь кеш только одного из них. К тому-же, фреймворк не должен решать за разработчика как хранить ключи и т.п.

    А коллизии md5 у нас уже несколько раз случались в названиях файлов, если это будет с кешем, то результат может быть хуже..

  31. №4256
    bettrrr
    bettrrr 30.03.2011, 17:48:02

    "Про addCookie, опять же, очень сферический пример." Ничего сферического, мне надо переопределить только этот метод, т.к. мне нужен другой механизм установки кук.

  32. №4257
    Sam
    Sam 30.03.2011, 18:13:57

    bettrrr, в мемкеше нельзя пробегать по записям.

    Какой именно другой механизм?

  33. №4265
    bettrrr
    bettrrr 31.03.2011, 19:33:03

    bettrrr, в мемкеше нельзя пробегать по записям.

    вжик http://ru.php.net/manual/en/memcache.getextendedstats.php

  34. №4266
    Sam
    Sam 01.04.2011, 0:22:06

    bettrrr, вжик-то вжик, но стоит прислушаться к рекомендациям разработчиков memcached. Плюс если ключей очень много, в статистике будут не все.

  35. №9029
    klay
    klay 01.06.2014, 16:21:24

    Пользуюсь Yii по работе буквально месяц. До этого работал около 4 лет с Kohana и Codeigniter. Всё отлично, всё нравится но вот взять тот же AR если я захочу его расширить. Например

    MActiveRecord extends CActiveRecord

    так, чтоб модельки наследовались от MActiveRecor а он в свою очередь от CActiveRecord, то куда мне его следует поместить? В extensions, в components, в models?

    Вообще мне оно пока кажется как то не однозначным. Например требуется некое расширение функционала. Нахожу на гитхабе. В readme написано

    This extension...

    в исходниках написано

    This component

    и работать будет куда бы его не положил. Подскажите, как правильно : ) Я понимаю, что это гибко, но блин слегка дезориентирует : )

    Спасибо

  36. №9031
    Sam
    Sam 01.06.2014, 19:50:32

    Правильно как вам удобнее. Я в 1.1 складываю в components.

  37. №9508
    Ivan
    Ivan 25.12.2014, 14:25:33

    Sam, возвращаясь к разговору о private и protected свойствах. CActiveRecord содержит два приватных свойства, которые мне необходимо расширить в родительском классе это:

    private static $_models=array(); private static $_md=array();

    А точнее даже не сами свойства, а методы, которые с ними работают. Но из родительских классов это сделать крайне проблематично без магии.

    Ранее в сообщениях вы оговариваете то, что можно использовать геттеры и сеттеры родительских классов для того чтобы работать с приватными свойствами, можете подробнее рассказать об этом? Или же сослаться на какой либо ресурс, где об этом можно прочесть?

  38. №9515
    Sam
    Sam 26.12.2014, 16:19:30

    Об этом лучше написать issue на GitHub проекта.

  39. №9542
    programolamer
    programolamer 05.01.2015, 13:21:48

    а реально ли использовать отдельно QueryBuilder от Yii2-фреймворка? можно с ActiveRecord можно без него, в первую очередь QueryBuilder нужен. Как его выдрать с минимальным уроном для последующих ручных обновлений?

  40. №9543
    Sam
    Sam 05.01.2015, 19:27:02

    Не особо реально.

  41. №9544
    programolamer
    programolamer 05.01.2015, 19:33:21

    очень жаль, буду смотреть в сторону Laravel Eloquent

  1. Почта опубликована не будет.

  2. Можно использовать синтаксис Markdown или HTML.

  3. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.