Каким способом Yii является список CModel (из других списков CModel или нет)? - PullRequest
3 голосов
/ 17 августа 2011

Я играю с Yii уже пару месяцев, и, чтобы структурировать код в стиле Yii, мне было интересно, как лучше всего сделать так, чтобы модели представляли собой списки других моделей.

В Yii, похоже, концептуально модели очень близки к DAO, в то время как дизайн MVC стремится не размещать модели без DAO где-либо еще, кроме моделей. (Я не эксперт MVC)

2 причины, списки хороши:

  • Я ищу что-то вроде CModelList для расширения при наличии объектов с достаточным количеством логики, которая не может быть решена с помощью отношений (который в любом случае является элементом CActiveRecord)
  • Списки как тип могут применять логику к элементам, при этом не нужно загружать их все в память сразу, и при этом предлагать один тип для воспроизведения по всему коду с идентификаторами и загружать только подмножество

Что, похоже, не решает проблему

  • Реляционная активная запись : поскольку не все модели являются активными записями
  • CAttributeCollection : поскольку он поддерживает только все объекты в памяти, например, массивы
  • Одинаковые методы в разных моделях, таких как getRestaurantsAverageRatingByPriceRange: потому что это функциональное программирование в ООП, быстро растущее, поскольку в моделях больше методов

Пример 1

$user = User::model()->findByPk($userID);  // get a user
$restaurantList = $user->getRestaurants(); // get restaurants for that user

for($i=0;$i<5;$i++) {
   $this->renderPartial( "rating", 
      array("rating" => $restaurantList->getAverageRatingByPriceRange( $i ) );
}  

Пример 2 (логика того же списка, другая базовая модель)

$city = City::model()->findByPk($cityID);  // get a city
$restaurantList = $city->getRestaurants(); // get restaurants for that city

for($i=0;$i<5;$i++) {
   $this->renderPartial( "rating", 
      array("rating" => $restaurantList->getAverageRatingByPriceRange( $i ) );
}  

Пример 3 (тот же тип списка и базовая модель, другая логика)

$user = User::model()->findByPk($userID);  // get a user
$restaurantList = $user->getRestaurants(); // get restaurants for that user


$this->renderPartial( "map", 
   array("coord" => $restaurantList->getCoordinatesMap() );

Так чего не хватает в Yii, стоит ли думать иначе или каков механизм использования и поддержания чистоты кода и структуры?

1 Ответ

2 голосов
/ 20 июня 2012

Использование поведения компонента

Компонент поддерживает шаблон mixin и может быть присоединен с одним или несколькими поведениями.Поведение - это объект, чьи методы могут быть «унаследованы» его присоединенным компонентом посредством сбора функциональности вместо специализации (т. Е. Обычного наследования классов).Компонент может быть связан с несколькими вариантами поведения и, таким образом, достигать «множественного наследования».

Классы поведения должны реализовывать интерфейс IBehavior.Большинство поведений могут выходить из базового класса CBehavior.Если к модели необходимо привязать поведение, оно может также расширяться от CModelBehavior или CActiveRecordBehavior , которое реализует дополнительные функции, определенные для моделей.

Чтобы использовать поведение,сначала он должен быть присоединен к компоненту путем вызова метода поведения attach().Затем мы можем вызвать метод поведения через компонент:

// $name uniquely identifies the behavior in the component
$component->attachBehavior($name,$behavior);
// test() is a method of $behavior
$component->test();

К присоединенному поведению можно получить доступ, как к обычному свойству компонента.Например, если к компоненту прикреплено поведение с именем дерева, мы можем получить ссылку на этот объект поведения с помощью:

$behavior=$component->tree;
// equivalent to the following:
// $behavior=$component->asa('tree');

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

$component->disableBehavior($name);
// the following statement will throw an exception
$component->test();
$component->enableBehavior($name);
// it works now
$component->test();

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

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

Свойства поведения также могут быть доступны через компонент, к которому оно прикреплено.Свойства включают в себя как открытые переменные-члены, так и свойства, определенные через методы получения и / или установки поведения.Например, если у поведения есть свойство с именем xyz и поведение привязано к компоненту $ a.Затем мы можем использовать выражение $a->xyz для доступа к свойству поведения.

Дополнительные сведения:
http://www.yiiframework.com/wiki/44/behaviors-events
http://www.ramirezcobos.com/2010/11/19/how-to-create-a-yii-behavior/

...