0 follower

Компонент

Yii-приложения состоят из компонентов–объектов, созданных согласно спецификациям. Компонент (component) - это экземпляр класса CComponent или производного от него. Использование компонента в основном включает доступ к его свойствам, а также вызов и обработку его событий. Базовый класс CComponent устанавливает то, как определяются свойства и события.

1. Свойство компонента

Свойство компонента схоже с публичной переменной-членом класса (public member variable). Мы можем читать или устанавливать его значение. Например:

$width=$component->textWidth; // получаем значение свойства textWidth
$component->enableCaching=true; // устанавливаем значение свойства enableCaching

Для того, чтобы создать свойство компонента необходимо просто объявить публичную переменную в классе компонента. Более гибкий вариант - определить методы, считывающие (getter) и записывающие (setter) это свойство, например:

public function getTextWidth()
{
    return $this->_textWidth;
}
 
public function setTextWidth($value)
{
    $this->_textWidth=$value;
}

В приведенном коде определено свойство textWidth (имя нечувствительно к регистру), доступное для записи.

При чтении вызывается метод чтения getTextWidth(), возвращающий значение свойства. Соответственно, при записи будет вызван метод записи setTextWidth(). Если метод записи не определен, свойство будет доступно только для чтения, а при попытке записи будет вызвано исключение. Использование методов чтения и записи имеет дополнительное преимущество: при чтении или записи значения свойства могут быть выполнены дополнительные действия (такие как проверка на корректность, вызов события и др.).

Примечание: Есть небольшая разница в определении свойства через методы и через простое объявление переменной. В первом случае имя свойства нечувствительно к регистру, во втором - чувствительно.

2. События компонента

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

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

public function onClicked($event)
{
    $this->raiseEvent('onClicked', $event);
}

где $event - это экземпляр класса CEvent или производного от него, представляющего параметр события. К событию можно подключить обработчик, как показано ниже:

$component->onClicked=$callback;

где $callback - это корректный callback-вызов PHP (см. PHP-функцию call_user_func). Это может быть либо глобальная функция, либо метод класса. В последнем случае вызову должен передаваться массив: array($object,'methodName').

Обработчик события должен быть определен следующим образом:

function methodName($event)
{
    ......
}

где $event - это параметр, описывающий событие (происходит из вызова raiseEvent()). Параметр $event - это экземпляр класса CEvent или его производного. Как минимум, он содержит информацию о том, кто вызвал событие.

Если теперь вызвать onClicked(), событие onClicked будет вызвано (внутри onClicked()), и прикрепленный обработчик события будет запущен автоматически.

К событию может быть прикреплено несколько обработчиков. При возникновении события обработчики будут вызваны в том порядке, в котором они были прикреплены к событию. Если в обработчике необходимо предотвратить вызов последующих обработчиков, необходимо установить $event->handled в true.

3. Поведение компонента

Начиная с версии 1.0.2, к компоненту была добавлена поддержка примесей (mixin) и теперь к компоненту можно прикрепить одно или несколько поведений. Поведение - это объект, чьи методы могут быть "унаследованы" компонентом, к которому прикреплены, посредством объединения функционала вместо четкой специализации (как в случае обычного наследования класса). К компоненту можно прикрепить несколько поведений и таким образом получить "множественное наследование".

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

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

// $name уникально идентифицирует поведения в компоненте
$component->attachBehavior($name,$behavior);
// test() является методом $behavior
$component->test();

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

$behavior=$component->tree;
// эквивалентно выражению:
// $behavior=$component->asa('tree');

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

$component->disableBehavior($name);
// выражение ниже приведет к вызову исключения
$component->test();
$component->enableBehavior($name);
// здесь все будет работать нормально
$component->test();

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

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