myks92
@myks92
Нашёл решение — пометь вопрос ответом!

Yii как лучше присваивать рейтинги пользователю?

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

Я выбрал следующую структуру:

public function attributeLabels()
    {
        return [
            'id' => Yii::t('rating', 'ID'),  //id рейтинга
            'user_id' => Yii::t('rating', 'User ID'), //id пользователя
            'value' => Yii::t('rating', 'Value'), //присваиваемое значение рейтинга (положительное/отрицательное)
            'type_id' => Yii::t('rating', 'Type ID'), //Тип рейтинга (комментарии, ответы...)
            'record_id' => Yii::t('rating', 'Record ID'), //id записи в системе для возможности отката
            'created_at' => Yii::t('rating', 'Created At') //Дата создания рейтинга
        ];
    }


Итоговый рейтинг будет получаться по запросу, который будет кэшироваться, либо создам в таблице
user
новое поле
rating
и там буду хранить итоговый рейтинг. Было бы не плохо прокомментировать и этот пункт.

Использовать собираюсь следующим образом:
Пользователь выполняет какое-либо действие, например, оставляет комментарий, регистрируется, заполняет профиль, публикует материал... За это ему полагается вознаграждение, которое фиксируется в таблице
rating
.

В связи с этим у меня появились вопросы: Где мне писать код? Как присваивать рейтинг пользователю? Что использовать: события или behaviors, компоненты или модели? Другими словами как расположить нужный код в нужном месте.

Например, запись в базу делаем в модели Rating. Для инициирования записи используем behaviors + события. В компоненте прописываем вычисления....

Надеюсь правильно изложил свой вопрос. Если что-то не понятно - напишите в комментарии. Такие вопросы, скорее всего из-за частичного знания фреймворка. Для чего использутся компоненты, behaviors, события и так далее..))

Сейчас есть следующий код в модели Rating
/**
     * Список типов рейтинга
     * @return array
     */
    public function getTypeList()
    {
        return [
            [ 'id' => 1, 'value' => 3, 'description' => 'Лайк'],
            [ 'id' => 2, 'value' => 5, 'description' => 'Комментарий'],
            [ 'id' => 3, 'value' => 30, 'description' => 'Заполнение профиля'],
            [ 'id' => 4, 'value' => 10, 'description' => 'Регистрация на сайте'],
        ];
    }

    /**
     * Добавление рейтинга пользователю
     * по переданным параметрам
     * @param int $user_id
     * @param int $type_id
     * @param int $record_id
     */
    public function getAddUserRating(int $user_id, int $type_id, int $record_id = null)
    {
        $model = new self();
        $value = 3;
        $model->user_id = $user_id;
        $model->value = $value;
        $model->type_id = $type_id;
        $model->record_id = $record_id;
        $model->created_at = time();
        $model->save();
    }

    /**
     * Удаление рейтинга пользователя
     * по id записи (откат)
     * @param $record_id
     */
    public function getDeletedUserRatingByRecord(int $record_id)
    {
        self::deleteAll(['record_id' => $record_id]);
    }

    /**
     * Изменение рейтинга пользовании по id записи
     * @param int $record_id
     * @return string
     */
    public function getUpdatedUserRatingByRecord(int $record_id)
    {
        //Код изменение рейтинга;
    }

    /**
     * Полное удаление всего рейтинга пользователя
     * по id пользователя
     * @param int $user_id
     */
    public function getDeletedUserRatingByUserId(int $user_id)
    {
        self::deleteAll(['user_id' => $user_id]);
    }

  • Вопрос задан
  • 104 просмотра
Решения вопроса 1
@kuftachev
Проведения (Behavior) нужны для того, чтобы использовать повторяющийся фрагмент кода в разных местах не копирую его каждый раз. Например, сохранение фотографий может быт нужно для аватарки и для обложки статьи.

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

Компоненты - это обычно какие-то штуки, которые нужно в разных частях приложения, и часто в единичном экземпляре, например, модель мы хотим засунуть как можно в более узкое место, поэтому она не компонент (хотя, по-моему от него тоже наследуется, но не уверен)... Я что-то сходу даже не придумал, для чего в Вашем случае может быть нужен свой компонент, за исключением инфраструктуры фреймворка, типа Запрос, Ответ, Роутинг, Сессии и т.д.

В итоге:
Контроллер принимает запрос и переправляет его к слою модели, модель что-то делает и контроллер рендерит представление (view) и отправляет результат.
Модель, если особой логики нет, то это может быть сама Active Record, если логики много, создаются сервисы, это тоже слой модели, но так получается понятнее код.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы