nepster-web
@nepster-web

Как правильно написать behaviors в yii2?

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

Для решения этих дел я выбрал поведения.

Я читал примеры статьи про написания поведений, но есть моменты, которые я не понял и хочу уточнить.

Первое и самое простое поведение это запись IP адреса в нужное поле:

<?php
namespace common\behaviors;

use Yii;
use yii\db\BaseActiveRecord;
use yii\db\Expression;
use yii\base\Behavior;

/**
 * IpBehavior автоматически заполняет указанные атрибуты с текущим ip адресом
 *
 *
 * public function behaviors()
 * {
 *     return [
 *         'IpBehavior' => [
 *             'class' => IpBehavior::className(),
 *             'attributes' => [
 *                 ActiveRecord::EVENT_BEFORE_INSERT => 'ip',
 *                 ActiveRecord::EVENT_BEFORE_UPDATE => 'ip',
 *             ]
 *         ],
 *     ];
 * }
 * ```
 */
class IpBehavior extends Behavior
{
    public $attributes = [
        BaseActiveRecord::EVENT_BEFORE_INSERT => 'ip',
        BaseActiveRecord::EVENT_BEFORE_UPDATE => 'ip',
    ];
    
    
    /**
    * Назначаем обработчик для [[owner]] событий
    * @return array события (array keys) с назначеными им обработчиками (array values)
    */
    public function events()
    {
        $events = $this->attributes;
        foreach ($events as $i => $event) {
            $events[$i] = 'getCurrentIp';
        }
        return $events;
    }
    
    
    /**
    * Добавляем IP адрес
    * @param Event $event Текущее событие
    */
    public function getCurrentIp($event)
    {
        $attributes = isset($this->attributes[$event->name]) ? (array)$this->attributes[$event->name] : [];
        
        if (!empty($attributes)) {
            foreach($attributes as $source => $attribute) {
                $this->owner->$attribute = Yii::$app->request->userIP;
            }
        }
    }
}


Правильный ли я выбрал подход для реализаций поведений?
  • Вопрос задан
  • 9418 просмотров
Пригласить эксперта
Ответы на вопрос 1
да, все верно.
только унаследовать наверное лучше от AttributeBehavior. Заодно посмотрите как он работает и как работают стандартные, унаследованные от него, поведения, и немного отрефакторите.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы