Прямой доступ к свойствам модели

Это здорово, что в версии 0.4.* появилась возможность автоматического доступа к полям модели из записи в БД, без постоянного прописывания get- и set-методов в файле *.entity.php.

Однако при попытке воспользоваться новым функционалом сразу столкнулся с проблемой:
Т.к. по логике, принятой в LS, все поля записываются в базе данных с префиксом (имя модели), то и автоматические геттеры теперь требуют имени модели.
Иначе говоря, если у нас есть модуль Test с таблицей prefix_test и полем в таблице test_name, то чтобы получить к нему доступ, нам нужно писать $oTest->getTestName() вместо привычного способа $oTest->getName(), который является логичным и удобным.

Я считаю, что необходимо ввести поддержку обоих вариантов, не только по причине неудобства варианта, который возможен сейчас, а еще и по более важной причине — совместимости.
Исторически в самом LiveStreet все методы были прописаны в *.entity.php и указывались без имени модели, например для блога — getDescription(), getTitle() и т.д., а никак не getBlogDescription() и getBlogTitle().

Подобный принцип наименования (вполне логичный и разумный) наследовали большинство модулей и плагинов, которые существуют на сегодняшний день, поэтому было бы совсем не разумно использовать половину методов (которые уже прописаны в *.entity.php) в одном виде, а другую половину, которая будет добавляться вместе с новыми свойствами моделей — в другом.

Предлагаю простой вариант, как исправить эту ошибку:
в /engine/classes/Entity.class.php, в методе __call()
после блока
if (isset($this->_aData[$sKey])) {					
  return $this->_aData[$sKey];
}
добавить блок
else {
  preg_match('/Entity([^_]+)/', get_class($this), $sModulePrefix);
  $sModulePrefix = strtolower($sModulePrefix[1]) .'_';
  if (isset($this->_aData[$sModulePrefix . $sKey])) {					
    return $this->_aData[$sModulePrefix . $sKey];
  }
}


На мой взгляд, это намного упростит и упорядочит работу с свойствами моделей.

6 комментариев

avatar
что делать с set*?
  • ort
  • -2
avatar
Это не так критично, потому что то, что записывается через set* и get* используется в методах Add и Update маппера, и там пользователь вручную прописывает, каким в какие поля будут записаны значения, доступные по определённому методу.
У нас ведь нет автоматической записи объекта в базу, это было бы уже ORM :)
Поэтому пользователь всегда знает, какой он метод использует для записи/чтения свойства.
avatar
* что записывается именно через set* используется в методах Add и Update, — разумеется.

В любом случае — не вполне логично в данном аспекте и в данный момент вводить новые стандарты. Раз изначально было принято использовать getProperty(), то стоит оставить это. Тем более, что именно такой способ наиболее логичен, и используется в большинстве фреймворков.
avatar
  • ort
  • 0
avatar
отлично )
avatar
в 70 строчке нужно заменить
$sModulePrefix=strtolower($sModulePrefix[1]).'_'

на
$sModulePrefix=strtolower(preg_replace('/([^A-Z])([A-Z])/',"$1_$2",$sModulePrefix[1])).'_';

а то для сущностей, например EntityUserInvite возвращает префикс userinvite_ вместо user_invite_.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.