Получить атрибуты модели в init при поведении yii2 - PullRequest
0 голосов
/ 29 января 2020

Вот мой код:

class CalculatedFieldsBehavior extends Behavior {
    public $calcFields = array();

    public function events() {
        return [
            ActiveRecord::EVENT_INIT => 'init',
        ];
    }

    public function init() {
        foreach ($this->owner->attributes() as $attribute) {
            if (strpos($attribute, 'calc_')) {
                if (!is_function(get_parent_class()::$set . \yii\helpers\camelize($attribute))) {
                    throw Exception("Function to set value of calc field '" . $attribute . "' not defined.");
                }

                $calcFields[] = $attribute;
            }
        }

        if (!($this->owner->hasAttribute('isCalcValueSet'))) {
            throw Exception("This table is missing a field for isCalcValueSet");
        }

        parent::init();
    }
}

И выдайте эту ошибку:

"name": "Exception",
"message": "Call to a member function attributes() on null",
"code": 0,
"type": "Error",
"file": "D:\\xampp\\htdocs\\backoffice\\common\\models\\CalculatedFieldsBehavior.php",
"line": 25,

1 Ответ

1 голос
/ 29 января 2020

$owner недоступно в init(). Он установлен в attach(). Обычно рабочий процесс выглядит следующим образом:

$behavior = new MyBehavior(); // init() is called here
$behavior->attach($owner); // owner is set here

Вы, вероятно, должны перезаписать attach() в вашем случае:

public function attach($owner) {
    foreach ($owner->attributes() as $attribute) {
        if (strpos($attribute, 'calc_')) {
            if (!is_function(get_parent_class()::$set . \yii\helpers\camelize($attribute))) {
                throw Exception("Function to set value of calc field '" . $attribute . "' not defined.");
            }

            $calcFields[] = $attribute;
        }
    }

    if (!($owner->hasAttribute('isCalcValueSet'))) {
        throw Exception("This table is missing a field for isCalcValueSet");
    }

    parent::attach($owner);
}
...