Создание объекта в yii2 с помощью Yii::createObject()
  • 1490

Создание объекта в yii2 с помощью Yii::createObject().

Автор: admin | 06 июня (Ср.) 2018г. в 15ч.02м.

Для создания нового объекта в php есть выражение new ClassName(). Можно также сразу передать
параметры в конструктор ClassName($param1, $param2, $param3). 

В Yii2 есть метод для создания нового объекта, который дает дополнительные возможности при инициализации
нового объекта -  \Yii::createObject($type, array $params = []) .

Первый параметр $type может быть строкой с именем класса, экземпляр которого создается. Может быть ассоциативным
массивом, где ключ class должен содержать имя класса. Также первый параметр может содержать
анонимную функцию или массив в виде имени класса и метода этого класса для обработки (` [$class or $object, $method] `)
и возвращаться должен объект, который нужно создать

Второй параметр $params - массив параметров, которые попадают в конструктор класса.

Примеры использования.

Создание объекта без параметров, используя имя класса:
$object = Yii::createObject('app\mydir\MyClass');​

или так:

use app\mydir\MyClass;
//...
/** @var MyClass $object */
$object = Yii::createObject(MyClass::className());

Создание объекта с параметрами, используя массив конфигурации:
$object = Yii::createObject([
    'class' => 'yii\db\Connection',
    'dsn' => 'mysql:host=127.0.0.1;dbname=demo',
    'username' => 'root',
    'password' => '',
    'charset' => 'utf8',
]);

Создание объекта с добавлением параметров через конструктор:

$object = \Yii::createObject('app\mydir\MyClass', [$param1, $param2]);

Создание объекта с передачей параметров через конструктор и через массив конфигурации:

$object = Yii::createObject([
    'class' => 'app\mydir\MyClass',
    'var1' => 'first',//это параметры, что инициализируются в конфигурационном массиве
    'var2' => 'second',
], [$param1, $param2]);//параметры в конструкторе

Также можно добавить в массив конфигурации и обработчики событий и поведений:

'on eventName' => $eventHandler, //имя события и обработчик
'as behaviorName' => $behaviorConfig, //имя поведения и конфигурация поведения

Класс, экземпляр которого создается с помощью \Yii::createObject($type, array $params = [])
должен наследовать yii\base\BaseObject или его потомка, например yii\base\Component

Конструктор класса наследника yii\base\BaseObject должен быть таким:

public function __construct($var1, $var2, $config = [])
{
    // ... initialization before configuration is applied

    parent::__construct($config);
}

Те параметры, что передаются в config создаются с помощью сеттеров по типу или они объявлены как public:

private $setVar1;

public function setVar1($value){
    $this->_setVar1 = trim($value);
}

Создание объекта, где первый параметр передается как анонимная функция:

$formatString = function($string, \yii\i18n\Formatter $formatter) {
    // ...
    
    //return obj;
}

$object = Yii::createObject($formatString, ['string' => 'Hello World!']);

echo $object->string; //выведет 'Hello World!'

Приветствую!

Меня зовут Сергей. Я - автор этого блога.

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