YiiFramework Yii PHP framework 2 public preview

Gas

может по одной?
Sam Dark
На свой страх и риск с этой недели начал новый проект на нем. Переход на 5.4 полностью поддерживаю, теперь только боюсь чтоб публичные интерфейсы сильно менять не начали :)
 

Sam Dark

Новичок
В 5.4 не так много возможностей. Короткий синтаксис для массивов, короткий echo в шаблонах, нормальный $this в замыканиях, кое-что из SPL уже использовали. С трейтами пока думаем. Никак не удаётся эффективно заменить behavior.
 

AmdY

Пью пиво
Команда форума
фичи 5.4 никак не должны сломать публичное апи, они лишь помогут улучшить код внутри и добавят возможности расширений.
 

Sam Dark

Новичок
Это да. API может чуть поломать довольно сильный рефакторинг AR под поддержку noSQL, хоть и не должен.
 

AmdY

Пью пиво
Команда форума
Sam Dark
а зачем их объединять? пускай было бы отдельное апи для sql баз данных, отдельное для монги, отдельное для редиса. Это абсолютно разные инструменты и пытаться использовать их одинаково - значит отказаться от плюшек каждой.
 

Sam Dark

Новичок
Все они вполне вписываются в AR. Слой ниже у всех будет свой.
 

Gas

может по одной?
С трейтами пока думаем.
вот про них и думал, что если начнёте внедрять трейты, то может и апи где-то поменяется.

Sam Dark
в Roadmap и сейчас стоит:
Todos BEFORE Beta: NoSQL backends for ActiveRecord
это всё ещё актуально? мне кажется из-за этого задерживать бету/релиз не стоит, но это конечно имхо.
 
Последнее редактирование:

Sam Dark

Новичок
Из за самого бекенда не стоит, а вот из за интерфейса и внутренностей AR, которые не позволяют написать такой backend, другое дело.
 

fixxxer

К.О.
Партнер клуба
вот про них и думал, что если начнёте внедрять трейты, то может и апи где-то поменяется.
А с чего ему меняться, если просто копипасту заменят трейтами?
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
подозреваю, что главная причина, почему текущая реализация может "не позволить написать такой backend" - это хардкодинг классов и отказ от DIC, то есть именно то, что заставило нас почти полностью переписать AR для поддержки репликации
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
у текущей реализации AR с NoSQL есть концептуальная проблема: для формирования запросов юзается схема, и это захардкодено,
https://github.com/yiisoft/yii2/blob/master/framework/yii/db/ActiveRecord.php#L379
https://github.com/yiisoft/yii2/blob/master/framework/yii/db/ActiveQuery.php#L157

а привычной схемы с PK, FK и скалярами в NoSQL концептуально нет, там документы с произвольной структурой и вложенностью;
надо вводить отдельный уровень абстракции вроде "источника данных", который может юзать схему, а может и не юзать.

можно попробовать сделать для NoSQL эмуляцию схемы, но это будет хрень
или можно предложить разработчикам самим писать схему ORM для NSQL-хранилища вместо автогенерации, но чтобы описать вложенность и наследование документов будет нужен собственный макро-язык,
 

fixxxer

К.О.
Партнер клуба
Вообще, как минимум для mongodb понятия PK и FK прекрасно мапятся на ObjectID и DBRefs.

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

grigori

( ͡° ͜ʖ ͡°)
Команда форума
я и говорю: можно сделать кастрированную эмуляцию или переделывать сам подход к работы через схему
скорее всего второе Тян зарубит в силу инертности мышления, а первое будет убогим, так что останется запись в todo в виде плана на будущее
 

Sam Dark

Новичок
Работа с SQL сейчас идёт на двух уровнях. Один над другим. Query builder и AR. AR именно про SQL ничего особо не знает.
По задумке у noSQL будет свой слой query builder, которым можно будет делать абсолютно все фичи, а интерфейс AR будет 1 в 1 как в случае SQL.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
так и я ж об этом! мешает хардкодинг :) уже не new CDBSchema, слава богу, но все еще $this->getTableShema()->columns - интерфейс заточен под RDB
 

fixxxer

К.О.
Партнер клуба
ну а вроде менять не так много? переименовываем columns в fields, делаем поля-объекты, поля вариантных типов и опциональные поля. для совместимости с РСУБД то, что не укладывается в columns, можно укладывать в json-поле (или если субд не поддерживает - json_encode в text)
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
fixxxer, Саша, я вот что имею ввиду:
когда РСУБД мапится на объекты, мы можем писать:
Order::find($id)->customer->name
это приводит к 2м запросам по FK или одному с 2мя JOIN,

в sql вариантов структуры данных нет.
при обработке find($id)->customer->name в AR формируется 2 объекта schema, которые парсят "show create table", и по информации о полях и pk строятся SQL-запросы;
вызов sql-ориентированных методов schema захардкоден в самом AR

когда мапится NoSQL, мы не знаем что такое $order->customer->name: обращение ко вложенному документу customer, или фильтрация списка customer, вариантов несколько
чтобы такую ситуацию обработать, нужен макро-язык описания мапинга связей на AR-объекты без имен таблиц, без getPK(), но с поддержкой связи типа вложенность, и совсем другой алгоритм формирования запросов

абстрагироваться от SQL - значит, переписать реализацию AR почти полностью
тут бы или крестик снять и забить на nosql, или вводить DI/абстрактную фабрику, но ни то ни другое великий кормчий делать не захочет
 
Последнее редактирование:

fixxxer

К.О.
Партнер клуба
ну почему без getPK()? его можно и оставить: это либо key в случае key-value, либо ID документа в случае документной базы

а в остальном да, ты прав. Я со своей велосипедоколокольни-то рассуждаю, у меня "ручной" AR с явно написанным SQL (или чем угодно - смотря какой диспетчер запросов) - мне проще ;)
 
Сверху