Как определить событие в Yii приложении - vorst.ru

Событие


пример события

При разработке сайта бывает логично определить функцию, как событие. То есть некий код выполняется при наступлении определенных условий. Собственно, это обычный метод класса, но алгоритм становится чуть проще и понятнее.

Событие

пример события

События бывают разные. Например, привезли хлеб и все, у кого он закончился, потянулись в магазин. То есть выполнили одно и тоже ответное действие. Выдали зарплату и все, естественно, тратят ее по разному.

В первом случае обработчик события один, во-втором их несколько. Пока рассмотрим первый вариант на основе пары предыдущих статей.


Я решил сохранять список статей, просмотренных посетителем сайта. Статья считается просмотренной, если загружен ее контент. Это происходит в двух случаях: при переходе к статье и при динамической загрузке. Два одинаковых события, на которые должна последовать одинаковая реакция.

Начнем с определения события. И сразу вопрос - где определять? Вариант может быть любой: модель, контроллер, любой другой класс, унаследованный от Component. Попробуем начать с модели.

Model

Сначала определим и подключим событие в common\models\Post.php.

class Post extends ActiveRecord
{
    const EVENT_POST_WAS_READ = 'post_was_read';
    const MAX_POST_TRACE = 10;
    public function init()
    {
        parent::init();
        $this->on(self::EVENT_POST_WAS_READ, [$this, 'keepTrace']);
    }

При регистрации передаем имя события и обработчик - имя метода объекта $this. Определим метод здесь же, в модели.

    /**
     * Save current time and post ID to keep user trace. 
     */
    public function keepTrace($event)
    {
        $session = \Yii::$app->session;
        // if not in a session, make empty array
        $trace = $session->has('trace') ? json_decode($session->get('trace')) : [];
        // if more then max elements then delete first
        if(count($trace) == self::MAX_POST_TRACE)
            array_shift($trace);
        // keep trace
        $trace[] = ['time' => time(), 'id' => $this->id];
        $session->set('trace', json_encode($trace));
    }

Controller

Теперь можно вызывать событие в контроллере frontend\controllers\PostController.php.

    public function actionView($id)
    {
        $model = $this->loadModel($id);
        $model->trigger(POST::EVENT_POST_WAS_READ);
        return $this->render('view', [
            'model' => $model,
        ]);
    }
    public function actionGetContent($id)
    {
        $model = $this->loadModel($id);
        $model->trigger(POST::EVENT_POST_WAS_READ);
        echo '<hr>' . $model->content;
    }

Заключение

Вообще-то ничто не мешает нам вызвать метод keepTrace напрямую. Но просмотр поста, это событие. Тут не о чем спорить :)

Оставьте комментарий

Только авторизованные посетители могут оставлять комментарии. Пожалуйста, войдите или пройдите регистрацию.