0 Пользователей и 1 Гость просматривают эту тему.
  • 16 Ответов
  • 1361 Просмотров
*

avantyrist

  • Захожу иногда
  • 228
  • 3 / 0
Приветствую.
Joomla 3.8.2
С исходниками когда ознакомлен...

Почему Joomla не сохраняет экземпляры jModel и jTable ?
Вызывая это:
JModelLegacy::getInstance('ModelName');
JTable::getInstance('TableName');
Мы всегда получаем новый экземпляры .

Почему в исходнике нет такого рода репозитория , хранилища ??
Спойлер
[свернуть]

Или глобального:
Спойлер
[свернуть]


Из глобальных компонентов я вертел только JoomShoping.
Там методы получения данных из БД размазаны везде.
Экземпляры jTable создаются прямо в циклах О_о.
Каждая итерация jTable::getInstance() --> new jTABLE   и пошла жара...  ЗАЧЕМ ?
VirtueMart бегло просмотрел... Вроде такая же история...

П\С Моё мнение, Прав ли я ?
Спойлер
[свернуть]

Объясните пожалуйста для чего (почему)?
Пожалуйста поддержите дискуссию... А то я сейчас стою на распутье дорог, и бАюсЯ свернуть не туды... :(
« Последнее редактирование: 19.12.2019, 01:38:59 от avantyrist »
*

avantyrist

  • Захожу иногда
  • 228
  • 3 / 0
Не ужели форум умер ? :(
Тем за 2019г очень мало :(
Joomla теряет популярность ?
*

Septdir

  • Живу я здесь
  • 3370
  • 168 / 4
Ну просто ваш вопрос ни кто не понял.
getInstance() даже если воспользоваться переводчиком означает получить экземпляр.
Соответственно вы получаете новый экземпляр каждый раз как вызываете этот метод.

Если взять для примера view, то вы там инициализируете модель, устанавливаете sates, а потом уже получаете из нее, то что вам нужно, если ваш запрос повторный, то получите уже за кешированный результат.

Если же засунь экземпляр в глобал, то потом проблем не оберетесь.
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
CodersRank | Контакты | Мой GitHub | Workshop
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Ну просто ваш вопрос ни кто не понял.
getInstance() даже если воспользоваться переводчиком означает получить экземпляр.
Соответственно вы получаете новый экземпляр каждый раз как вызываете этот метод.

Если взять для примера view, то вы там инициализируете модель, устанавливаете sates, а потом уже получаете из нее, то что вам нужно, если ваш запрос повторный, то получите уже за кешированный результат.

Если же засунь экземпляр в глобал, то потом проблем не оберетесь.
Я понял, о чем ТС писал. На самом деле, вопрос интересный. Раньше уже обратил на это внимание, но не было времени разобраться.
Дело в том, что при вызове JModel и JTable всегда создается новый объект, не смотря на вводящий в заблуждение метод getInstance(). Думаю, что на это были причины и вопрос скорее надо задать разработчикам Joomla.
getInstance() даже если воспользоваться переводчиком означает получить экземпляр.
Соответственно вы получаете новый экземпляр каждый раз как вызываете этот метод.
А это не верно: по принципу Singleton одновременно существует только 1 экземпляр, он создается только если его до этого не было.
« Последнее редактирование: 20.12.2019, 16:59:59 от robert »
Не будь паразитом, сделай что-нибудь самостоятельно!
*

avantyrist

  • Захожу иногда
  • 228
  • 3 / 0
Я о том же.
Щас MVC переписываю :)
По принципу  Singleton и Фабрик.

- Получив ProductModel он автоматом создаст ProductTable.   (привязка к '#__product')
       Оба экземпляра будут сохранены в хранилище.

- Далее гдето очень углубились в дебри получения всевозможных данных. Нам понадобился ProductTable.
        Получая его - он не будет создаваться как новый экземпляр. А вытянется из хранилища.
 

Вот пример из JoomShoping который ставит меня в ступор:
Спойлер
[свернуть]

А вот виновник торжества.....
Который только и делает что обрабатывает имя создаваемого класса.
И создаёт его всегда НОВЫЙ.   return new $tableClass($db);
Спойлер
[свернуть]

Вызывая JshoppingModelBaseadmin->publish()
Вот это JTable::getInstance($type, $prefix, $config)  будет создавать НОВЫЙ экземпляр.

Вот обьясните накой черт тут в цикле они создают каждый раз НОВЫЙ экземпляр jTable.
Да тут они явно забыли про методы $table->reset(); и $table->load();   Ну бывает....
Но экземпляр таблицы который они получают тут в цикле может ещё где-то создаваться сотню раз. Каждый раз НОВЫЙ....  Зачем ?
Тоже самое с моделью.

Мне больше так нравится:
     Создался раз -> Запомнили его в хранилище -> Потом тянем из хранилища.

Но вот почему Joomla делает не так :( ? В каких целях ?
« Последнее редактирование: 20.12.2019, 18:04:42 от avantyrist »
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Но вот почему Joomla делает не так  ? В каких целях ?
Думаю, что на это были причины и вопрос скорее надо задать разработчикам Joomla.
В остальных случаях же вызывается единственный экземпляр?
Не будь паразитом, сделай что-нибудь самостоятельно!
*

avantyrist

  • Захожу иногда
  • 228
  • 3 / 0
MODEL             -> всегда новый
TABLE              -> всегда новый
VIEW               -> всегда новый, ну по логике да так и надо...
CONTROLLER   -> Singleton
Спойлер
[свернуть]

И то его можно переопределить...
Спойлер
[свернуть]
Работает себе контролёр и тут на тебе вклинили GameOver :) и запустили ещё парочку контроллёров :)

----------------------------------------------------------------------
Да, вопрос этот к разработчикам движка.
Но на форум обитают люди которые подарили миру отличные расширения этого движка.
Вот и надеюсь что тут кто-то ответит.


« Последнее редактирование: 20.12.2019, 19:27:52 от avantyrist »
*

Septdir

  • Живу я здесь
  • 3370
  • 168 / 4
А это не верно: по принципу Singleton одновременно существует только 1 экземпляр, он создается только если его до этого не было.
Так в другом месте его и не было.

Если уж говорим о singleton и table, то хорошим примером будет batch. Принцип прост.
Получил экземпляр таблицы и уже в цикле reset, load, store. Тут это довольно удобно. Да и каждый плодить экземпляры не нужно.

Вообще причин много.
С таблицами все довольно просто. Зачастую они завязан на один итем, один итем один экземпляр. Подразумеваться что дальнейшем тебе нужно работать с каждым экземпляром Table по отдельности. Так к примеру если хранить table а не создавать новый экземпляр, то сделав
Код
$table Table::getInstance();
$table->title = 'yes';
$table >store();
в абсолютно левом месте, я тайтл yes запишу в какой-то левый итем.

У моделей же все завязано на state. Так к примеру если создать экземпляр до цикла, а потом в цикле делать сохранения, то даже если частично сбрасывать sates все равно что-то забудешь, плюс еще гора сохранённых значений. И тут либо что-то не установишь, либо останется, какой-нибудь state со старым значением. (я как-то раз с таким столкнулся).
То бишь опять-таки нужно работать с каждым экземпляром отдельно.

Вообще когда ты используешь getInstance в большинстве случаев тебе нужен чистый экземпляр без данных, поэтому чтобы не ломать голову с тем, а что ты получишь, проще сделать еще один. Ну и не стоит забывать что и model и table и view могут быть использованные не только в компонентах, а везде где только можно.

К слову в большинстве своем helpers singletone.

Ну а вообще robert прав, стоит спросить на github, там всегда на тебя вываливают гору аргументов, иногда это помогает понять почему так, а иногда нет.
« Последнее редактирование: 21.12.2019, 01:47:59 от Septdir »
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
CodersRank | Контакты | Мой GitHub | Workshop
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
Думаю, что на это были причины и вопрос скорее надо задать разработчикам Joomla.
а иначе ж не получится. допустим у вас есть экземпляр текущего юзера, и вам понадобилось загрузить данные из другой таблицы, например материалов которые принадлежат этому юзеру. вы получаете экземпляр таблицы материалов - и это бы означало что вы получили ссылку на таблицу юзеров, при чем уже инициализированного конкретным юзером :) тоже самое с моделями - когда необходима работа одновременно с несколькими экземплярами, то нет возможности делать это синглтоном. но с другой стороны мы можем сами управлять ними, как например Factory::getUser возвращает именно синглтон
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Ну, для этого есть load(), reset(), get($new = true) и т.д. Хотя вспомнил, как в первое время мучился с JDatabaseQuery ^-^. Единственный полезный момент - это, конечно, когда работаешь с несколькими экземплярами одновременно. Но с JUser тоже как-то обходились клонами ;).
Не будь паразитом, сделай что-нибудь самостоятельно!
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
угу, именно когда одновременно
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

avantyrist

  • Захожу иногда
  • 228
  • 3 / 0
TABLE:
Но ведь экземпляр наследующий jTable может быть сам по себе Singleton. И храниться в $coreRepository
Данные итема хранить не как свойства этого экземпляра. а в Хранилище $dataRepository
Метод загрузки данных load($forsed=false) может вызываться с флагом FORSED.
     Указывающий на загрузку данных из БД или Хранилища.
Таким образом Данные будут доступны везде. И не надо их будет постоянно дёргать из БД.

И кстати. При создании экземпляра jTable ВСЕГДА идёт запрос в БД на получение имён полей таблицы.

Спойлер
[свернуть]

Спойлер
[свернуть]


dmitry_stas Вы завсегдатый на JoomShoping канале. Поидеи вы знаете его вдоль и поперёк.
Вас не смущаяют методы из JshoppingModelBaseadmin в админке. 
Там где они в цикле гоняют получение экземпляра таблиц.
Так к примеру захотел соточку итемов поставить в publish() и получил на выходе 200 запросов в БД  *suicide*
     -- 100 на получение названия полей из БД
     -- 100 на сохранение новых данных.
Это Норм ??

П\С
Спасибо за дискусию
*

ProtectYourSite

  • Живу я здесь
  • 2356
  • 135 / 4
  • Безопасность вебсайтов
Дело в том, что при вызове JModel и JTable всегда создается новый объект, не смотря на вводящий в заблуждение метод getInstance(). Думаю, что на это были причины и вопрос скорее надо задать разработчикам Joomla.А это не верно: по принципу Singleton одновременно существует только 1 экземпляр, он создается только если его до этого не было.
Как раз таки наличие метода getInstance() не говорит, что это синглтон.
Синглтоны порождают проблемы при тестировании и отладке, поэтому, если в них нет острой необходимости, то их стараются не использовать либо делать это немного другой реализацией.
*

ProtectYourSite

  • Живу я здесь
  • 2356
  • 135 / 4
  • Безопасность вебсайтов
Так к примеру захотел соточку итемов поставить в publish() и получил на выходе 200 запросов в БД
Палка о двух концах, если объединить это в один запрос, и он окажется достаточно тяжёлым, то он залочит таблицу и все остальные запросы зависнут. Поэтому считается хорошей практикой на апдейт делать много запросов.
*

avantyrist

  • Захожу иногда
  • 228
  • 3 / 0
ProtectYourSite
Это да.
Если именно Синглтон то у него должен быть закрытый конструктор, клоны, вейкапы (магические методы)
Тоесть он должен быть ну прям сооооовсем один одиношечка.
А я тут говорю о единственных экземплярах наследников Model и Table.

*

avantyrist

  • Захожу иногда
  • 228
  • 3 / 0
Палка о двух концах, если объединить это в один запрос, и он окажется достаточно тяжёлым, то он залочит таблицу и все остальные запросы зависнут. Поэтому считается хорошей практикой на апдейт делать много запросов.

Это да. Мелкие запросы ГУД
Но я говорил о конкретном примере
Спойлер
[свернуть]

При создании экземпляра jTable ВСЕГДА идёт запрос в БД на получение имён полей таблицы

К примеру надо опубликовать 100 итомов
   - 100 раз получили названия полей
   - 100 раз изменили(сохранили) данные
Итого 200 запрососв.

Этот  пример я привожу так как такого рода бред встречается очень часто.



*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
При создании экземпляра jTable ВСЕГДА идёт запрос в БД на получение имён полей таблицы
не имена столбцов, а именно загрузка текущего итема. имена столбцов грузятся только 1 раз, при первой инициализации таблицы

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

Палка о двух концах, если объединить это в один запрос, и он окажется достаточно тяжёлым, то он залочит таблицу и все остальные запросы зависнут. Поэтому считается хорошей практикой на апдейт делать много запросов.
так и есть. всегда приходится искать какой то компромисс между скоростью и памятью. это само собой работает медленнее чем 1 запрос, но зато наверняка отработает, а не вывалится по памяти

Так к примеру захотел соточку итемов поставить в publish() и получил на выходе 200 запросов в БД
ну а вы проведите эксперимент, посмотрите в отладке сколько это времени занимает, и если это был бы один запрос. увидите что не так это и критично
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

[решено] Использование model - setState для фильтра по дате

Автор effrit

Ответов: 8
Просмотров: 1450
Последний ответ 13.10.2018, 19:13:49
от effrit
Получение содержимого страницы любого компонента

Автор jmaf

Ответов: 6
Просмотров: 1247
Последний ответ 03.04.2016, 18:25:06
от b2z
TRUNCATE TABLE в компоненте Joomla3

Автор nils_bor

Ответов: 7
Просмотров: 2379
Последний ответ 06.12.2014, 00:41:36
от nils_bor
Отправка запроса POST и получение ответа? Joomla 3.1.5

Автор infoehra

Ответов: 8
Просмотров: 2003
Последний ответ 11.11.2013, 10:33:03
от infoehra
Важное изменение в Joomla Platform - упрощенные Model, View и Controller

Автор b2z

Ответов: 2
Просмотров: 2218
Последний ответ 13.04.2012, 17:11:27
от b2z