Почему в Yii свой ActiveRecord
10 марта 2011
Казалось бы, зачем изобретать велосипед и писать свой Active Record, а не взять существующую реализацию… например, phpactiverecord, RedBeanPHP или тот же ORM Doctrine. В случае Yii всё не так однозначно:
- AR в Yii старше большинства готовых решений. Первые версии были реализованы в 2005-м ещё в Prado. AR постоянно улучшался и затем перекочевал в Yii, где улучшения продолжаются и сейчас.
- Свой AR даёт более «ровный» API.
- Использование внешнего кода = потеря контроля качества реализации. В стороннем коде могут быть ошибки, которые по каким-либо причинам не смогут быстро исправить… а ведь AR — очень важная часть фреймворка.
Комментарии RSS по email OK
Свой велосипед всегда лучше, когда он уже есть, "отточен" и устраивает :)
Дайте пожалуйста еще тестовых классов. А то CDbTestCase прямо скажем неудобный для тестирования AR. Хотелось бы что-то вроде Shoulda (ror)
[offtopic]Александр! Как вы относитесь к идее добавить на сайте кнопки Facebook Like и Twitter tweet? Этот пост — ППКС, и хочется поделиться им с другими людьми.[/offtopic]
"Использование внешнего кода = потеря контроля качества реализации" Потеря чего????? Нам тут приходится иметь секс с YII не по нашей воле... Мы все просто в шоке от качества. Особенно от крутой расширяемости классов! Думаем заслать кого-нибудь в Японию или Китай и где там живёт ксуангксинг.
@bettrrr, патчей и конкретных предложений, я полагаю, от вас не ждать?
@bettrrr, меня в Yii все кроме php устраивает xD
Я думал это и так очевидно, но AR в yii еще есть куда расти.
Можете объяснить в нескольких словах - что такое ActiveRecord?
@Тормоз, это Yii-шный ORM - прослоечка для работы с бд.
tipugin, т.е. оно, как я понял, для тестирования набора валидаторов?
resurtm, добавил.
bettrrr, очень жду от вас баг-репортов и конкретных предложений. Можно в почту, можно сразу в трекер.
Ekstazi, конечно есть. Со следующим релизом AR подрастёт хорошенько… код уже влит, осталось документацию написать.
Тормоз, это класс.
save
(как правило) в таблицу добавляется новая запись.@Sam, да, для валидаторов, отношений, поведения контроллеров и тп.
Спасибо, но почти ничего не понял :) Придётся почитать, для чего оно нужно.
tipugin, а как пользоваться DbTestCase?? Гугл об использовании такого класса не знает.....
@Игорь, http://yiiframework.ru/doc/guide/ru/test.unit
tipugin, благодарю, оплошал.
а мне вот интересно почему в yii до сих используется устаревший код для jquery, хотя сам использует последний jquery. Я про стандартные assets, все не проверял, но в autocomplete тянется куча барахла, которое уже устарело.
jquery.ajaxqueue.js - устарело, можно реализовать средствами последних jquery
jquery.dimensions.js - тоже устарело, вообще уже с версии jquery 1.2.6 встроен.
Это так навскидку. Я понимаю, что это по-идее не много по размеру и количеству файлов, но все равно не помешало бы не только обновлять сам jquery, но и код поддерживать код в более актуальном состоянии. Это так...пожелания :) В данный момент, мне пришлось переделать widget autocomplete, чтобы избавиться от этого мусора из-за которого он у меня не работал.
Andrey Gayvoronsky, использовали
CAutoComplete
, который помечен какdeprecated
?раз пошла такая пьянка, тогда реквестирую обновленные хелперы для CHtml, которые генерят инпуты с новыми html5 типами (email, url) и т.п.
@tipugin,
Sam, потому что использовать Jui нет желания вообще.
Но если уж на то пошло, то он deprecated с 1.1.3, а там уже jQuery 1.4.2 используется(она вообще в yii c 1.1.2 используется) и это не было пофиксено еще с тех самых пор. Сейчас, конечно, можно сослаться на "deprecated", но это не отменяет актуальности того вопроса который я затронул - обновляются библиотеки, но не обновляется код.
P.S.: в первом сообщении я привел пример и озвучил проблему актуальности кода. Это к вопросу:
Не более того.
@Andrey Gayvoronsky, так всё приведённое в пример как раз в
CAutoComplete
и используется. jQueryUI и свои компоненты из Zii регулярно обновляются.да писал не об этом. а насчет zii - нет желания из-за одного autocomplete подключать весь jquery.ui
Вот какого хрена?
а не:
уже успели встарять из-за этого (в очередной раз). реализацию каждой функции приходится смотреть и исходниках фреймворка, чтобы не нарваться на очередной косяк.
А теперь давайте расширим этот класс! А вот х...!
bettrrr, какой смысл увеличивать длину ключа?
Ну и в
CHttpRequest
есть геттеры для всех свойств, именно их и стоит перекрывать.private
-переменные — это своего рода кеш и от открытия их лучше не станет.CHttpSession.php
А что-же не из конфига то? Т.е. если несколько проектов, работает с одним окружением, то надо переобределять опцию конфига.
Это значительно уменьшит возможность совпадения md5. И даёт возможность чистить кеш по префиксу и анализировать его.
"Ну и в CHttpRequest есть геттеры для всех свойств." Эти свойства используются внутри методов класса. Мне надо переопределить один из методов. Геттеры и сеттеры не имеют доступа к прайват свойствам родителя.
Пример: мне надо переопределить addCookie() в этом классе.
ВОт это сделать не получится.
bettrrr, имея лишь часть ключа, насколько мне известно, ни один бэкенд кэша не позволит удалить по ней все ключи. Нужно знать точное имя. Про коллизии более весомый аргумент, но почему-то в трекере проекта этого ещё нет.
Про
CHttpSession
и конфиг не понял.Но имеют доступ к геттерам родителя. Про addCookie, опять же, очень сферический пример. Расскажите, что именно нужно (на высоком уровне), я попробую расписать, как это сделать. Не получится — оформим как баг.
Из мемкеша например, в любом случае приходится тереть записи пробегая по ним. С префиксом это удобней. Иногда надо стереть весь кеш, но на одном сервере несколько проектов, с именованием ключей в md5, не получится удалить весь кеш только одного из них. К тому-же, фреймворк не должен решать за разработчика как хранить ключи и т.п.
А коллизии md5 у нас уже несколько раз случались в названиях файлов, если это будет с кешем, то результат может быть хуже..
"Про addCookie, опять же, очень сферический пример." Ничего сферического, мне надо переопределить только этот метод, т.к. мне нужен другой механизм установки кук.
bettrrr, в мемкеше нельзя пробегать по записям.
Какой именно другой механизм?
вжик http://ru.php.net/manual/en/memcache.getextendedstats.php
bettrrr, вжик-то вжик, но стоит прислушаться к рекомендациям разработчиков memcached. Плюс если ключей очень много, в статистике будут не все.
Пользуюсь Yii по работе буквально месяц. До этого работал около 4 лет с Kohana и Codeigniter. Всё отлично, всё нравится но вот взять тот же AR если я захочу его расширить. Например
так, чтоб модельки наследовались от MActiveRecor а он в свою очередь от CActiveRecord, то куда мне его следует поместить? В extensions, в components, в models?
Вообще мне оно пока кажется как то не однозначным. Например требуется некое расширение функционала. Нахожу на гитхабе. В readme написано
в исходниках написано
и работать будет куда бы его не положил. Подскажите, как правильно : ) Я понимаю, что это гибко, но блин слегка дезориентирует : )
Спасибо
Правильно как вам удобнее. Я в 1.1 складываю в
components
.Sam, возвращаясь к разговору о private и protected свойствах. CActiveRecord содержит два приватных свойства, которые мне необходимо расширить в родительском классе это:
private static $_models=array(); private static $_md=array();
А точнее даже не сами свойства, а методы, которые с ними работают. Но из родительских классов это сделать крайне проблематично без магии.
Ранее в сообщениях вы оговариваете то, что можно использовать геттеры и сеттеры родительских классов для того чтобы работать с приватными свойствами, можете подробнее рассказать об этом? Или же сослаться на какой либо ресурс, где об этом можно прочесть?
Об этом лучше написать issue на GitHub проекта.
а реально ли использовать отдельно QueryBuilder от Yii2-фреймворка? можно с ActiveRecord можно без него, в первую очередь QueryBuilder нужен. Как его выдрать с минимальным уроном для последующих ручных обновлений?
Не особо реально.
очень жаль, буду смотреть в сторону Laravel Eloquent