Yii2 behaviors. Частина 3

15

Від автора: вітаю вас, друзі. Ми продовжуємо цикл статей, присвячених знайомству з фреймворком Yii2. У цій статті ми продовжимо знайомитися з темою поводжень фреймворку — Yii2 behaviors, завдяки яким ми можемо розширювати функціональність нашого коду.

Отже, у двох попередніх статтях ми познайомилися з поняттям поводжень в Yii і використовували в роботі готове поведінка TimestampBehavior, завдяки якому для статей призначаються дата і час їх створення або зміни без нашої участі, тобто автоматично. Це дуже зручно.

Крім цього поведінки Yii пропонує ще кілька готових до використання поводжень, наприклад, SluggableBehavior, AttributeBehavior та інші. Також Yii дозволяє створювати і власні поведінки – ця тема нас і цікавить в рамках поточної статті.

Для того, щоб реалізувати поведінку, необхідно створити клас, що розширює базовий клас yii\base\Behavior. Створимо в корені папки components і в ній іскова клас:

namespace app\components;
use yii\base\Behavior;
class TestBehavior extends Behavior{
}

Yii2 behaviors. Частина 3

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

Далі додамо в клас створюваного behavior наступний код:

class TestBehavior extends Behavior{
public $title = ‘title’;
public function events(){
return [
ActiveRecord::EVENT_BEFORE_VALIDATE => ‘changeTitle’,
];
}
public function changeTitle($event){
echo «;
var_dump($event);
die;
}
}

Давайте розберемо його. Поведінка має одну властивість, яку ми назвали $title. Назвати його можна як завгодно, це не настільки важливо. Більш важливо тут значення за замовчуванням. Це значення відповідає атрибуту моделі. Оскільки ми хочемо працювати з найменуваннями матеріалів, значенням за замовчуванням я вибрав title, оскільки звик використовувати саме його. Відповідно, якщо поле моделі називається саме так, тоді користувач при конфігурації поведінки може не вказувати найменування атрибута. Якщо ж найменування відрізняється, тоді користувач перевизначити при прикріпленні behavior.

Далі йде якийсь метод events. Даний метод ми повинні змінити, якщо наша поведінка має реагувати на деякі події. У прикладі вище, наша поведінка буде реагувати на подію beforeValidate. Для цієї події ми призначаємо метод changeTitle, якою і опишемо нижче. В якості параметра метод приймає об’єкт події. У методі ми роздрукуємо його на екран і завершимо подальше виконання програми. Давайте поглянемо на нього. Для цього спробуємо додати ще одну новину. Але перед цим прикріпимо поведінку до моделі. Там у нас вже використовується поведінка TimestampBehavior, просто допишемо ще своє:

public function behaviors(){
return [
[
‘class’ => TimestampBehavior::className(),
‘attributes’ => [
ActiveRecord::EVENT_BEFORE_INSERT => [‘created_at’, ‘updated_at’],
ActiveRecord::EVENT_BEFORE_UPDATE => [‘updated_at’],
],
// якщо замість позначки часу UNIX використовується datetime:
‘value’ => new Expression(‘NOW()’),
],
[
‘class’ => TestBehavior::className(),
‘title’ => ‘title’,
],
];
}

Ну а тепер пробуємо додати новину.

Yii2 behaviors. Частина 3

На скріншоті я виділив нас цікавить частину об’єкта, в елементі title знаходиться назву новини, яку я намагаюся додати. Щоб отримати безпосередній доступ до нього, потрібно звернутися наступним чином: $this->owner->{$this->title}, де $this->title – нас цікавить властивість. Якщо б, наприклад, був би ще текст новости, який записується у властивість моделі content, то до нього ми б звернулися так: $this->owner->{$this->content}.

Подальший хід дій, думаю, зрозумілий. Якщо ми маємо доступ до потрібного нам значенням, — ми вільні робити з ним все що завгодно. Наприклад, наведемо весь рядок до верхнього регістру:

public function changeTitle($event){
$this->owner->{$this->title} = mb_strtoupper($this->owner->{$this->title}, ‘UTF-8’);
}

І спробуємо ще раз додати новину, друкуючи її назву в нижньому регістрі.

Yii2 behaviors. Частина 3

Пробуємо зберегти і насолоджуємося результатом:

Yii2 behaviors. Частина 3

Відмінно! У нас все вийшло. Це, звичайно, найпростіший приклад створення власних поводжень в Yii, але нас ніхто не обмежує Yii2 behaviors. Частина 3

Більше про фреймворку ви можете дізнатися з наших безкоштовних або платних уроків. Також створення найпростішого блогу на Yii2 можна подивитися в цьому циклі уроків.