Оглавление

Введение Первое знакомство Структура приложения Обработка запросов Основные понятия Работа с базами данных Получение данных от пользователя Отображение данных Безопасность Кеширование Веб-сервисы REST Тестирование Специальные темы Виджеты Хелперы
Зачем реклама?

Компоненты

Компоненты — это главные строительные блоки приложений основанных на Yii. Компоненты наследуются от класса yii\base\Component или его наследников. Три главные возможности, которые компоненты предоставляют для других классов:

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

use yii\jui\DatePicker;

echo 
DatePicker::widget([
    
'language' => 'ru',
    
'name'  => 'country',
    
'clientOptions' => [
        
'dateFormat' => 'yy-mm-dd',
    ],
]);

Свойства виджета легко доступны для записи потому, что его класс унаследован от класса yii\base\Component.

Компоненты — очень мощный инструмент. Но в то же время они немного тяжелее обычных объектов, потому что на поддержку событий и поведений тратится дополнительные память и процессорное время. Если ваши компоненты не нуждаются в этих двух возможностях, вам стоит унаследовать их от yii\base\BaseObject, а не от yii\base\Component. Поступив так, вы сделаете ваши компоненты такими же эффективными, как и обычные PHP объекты, но с поддержкой свойств.

При наследовании ваших классов от yii\base\Component или yii\base\BaseObject, рекомендуется следовать некоторым соглашениям:

  • Если вы переопределяете конструктор, то добавьте последним аргументом параметр $config и затем передайте его в конструктор предка.
  • Всегда вызывайте конструктор предка в конце вашего переопределенного конструктора.
  • Если вы переопределяете метод yii\base\BaseObject::init(), убедитесь, что вы вызываете родительскую реализацию этого метода в начале вашего метода init().

Пример:

<?php

namespace yii\components\MyClass;

use 
yii\base\BaseObject;

class 
MyClass extends BaseObject
{
    public 
$prop1;
    public 
$prop2;

    public function 
__construct($param1$param2$config = [])
    {
        
// ... инициализация происходит перед тем, как будет применена конфигурация.

        
parent::__construct($config);
    }

    public function 
init()
    {
        
parent::init();

        
// ... инициализация происходит после того, как была применена конфигурация.
    
}
}

Следуя этому руководству вы позволите настраивать ваш компонент при создании. Например:

$component = new MyClass(12, ['prop1' => 3'prop2' => 4]);
// альтернативный способ
$component = \Yii::createObject([
    
'class' => MyClass::className(),
    
'prop1' => 3,
    
'prop2' => 4,
], [
12]);

Info: Способ инициализации через вызов Yii::createObject() выглядит более сложным. Но в то же время он более мощный из-за того, что он реализован на самом верху контейнера внедрения зависимостей.

Жизненный цикл объектов класса yii\base\BaseObject содержит следующие этапы:

  1. Предварительная инициализация в конструкторе. Здесь вы можете установить значения свойств по умолчанию.
  2. Конфигурация объекта с помощью $config. Во время конфигурации могут быть перезаписаны значения свойств по умолчанию, установленные в конструкторе.
  3. Конфигурация после инициализации в методе init(). Вы можете переопределить этот метод, для проверки готовности объекта и нормализации свойств.
  4. Вызов методов объекта.

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


Зачем реклама?