@AlikDex

Статусы сущности бд. Каким образом оптимальнее делать?

Попытаюсь объяснить на пальцах. Вот есть к примеру моделька галереи картинок:
spoiler

<?php

namespace app\models\galleries;

use Yii;

use app\models\galleries\GalleryImages;

class Gallery extends \yii\db\ActiveRecord
{
    const STATUS_INACTIVE = 0;  // неактивный / в пуле
    const STATUS_ACTIVE 	= 10; // активный
    const STATUS_PROCESS = 20; // в процессе обработки.
    const STATUS_ERROR = 50; // ошибка.
    const STATUS_IMPORTED = 80; // импортирован
    const STATUS_DELETED = 90; // удален

    public static function tableName()
    {
        return 'gallery';
    }

    public function rules()
    {
        return [
            [['created_by', 'studio', 'mix', 'images_count', 'status'], 'integer'],
            [['created_at', 'published_at'], 'safe'],
            [['hash'], 'string', 'max' => 32],
            [['title'], 'string', 'max' => 255],
        ];
    }

    public function attributeLabels()
    {
        return [
            'g_id' => 'G ID',
            'created_by' => 'Created By',
            'hash' => 'Hash',
            'title' => 'Title',
            'studio' => 'Studio',
            'mix' => 'Mix',
            'images_count' => 'Images Count',
            'published_at' => 'Published At',
            'created_at' => 'Created At',
        ];
    }

    public function getHasImages()
    {
        return !empty($this->images);
    }

    public function getImages()
    {
        return $this->hasMany(GalleryImages::className(), ['g_id' => 'g_id']);
    }

    public static function getStatuses()
    {
        return [
            self::STATUS_INACTIVE => 'Не активно',
            self::STATUS_ACTIVE => 'Активно',
            self::STATUS_PROCESS => 'В обработке',
            self::STATUS_ERROR => 'Ошибка',
            self::STATUS_IMPORTED => 'Импортировано',
            self::STATUS_DELETED => 'Удалено',
        ];
    }

    public function getColoredStatus()
    {
        $statuses = [
            self::STATUS_INACTIVE => '<span class="text-status brown">Не активно</span>',
            self::STATUS_ACTIVE => '<span class="text-status green">Активно</span>',
            self::STATUS_PROCESS => '<span class="text-status purple">В обработке</span>',
            self::STATUS_ERROR => '<span class="text-status brown">Ошибка</span>',
            self::STATUS_IMPORTED => '<span class="text-status orange">Импортировано</span>',
            self::STATUS_DELETED => '<span class="text-status brown">Удалено</span>',
        ];

        return isset($statuses[$this->status]) ? $statuses[$this->status] : 'unknown';
    }
}


Посмотрел когда-то всякие там гайды, делают примерно так (с различными вариациями). Но тут что-то осенило. Ведь если кешировать эти модели, то в каждой хранится этот список статусов лишний. Возник вопрос, куда их вынести в таком случае лучше? Сначала подумал как-то в ланг. массивах хранить списки, но не нашел каким образом. Потом пришла мысль перенести в форму эти статусы. Ну, вроде вызываем форму, там эти списки как правило требуются полностью для селектов. Идея показалась глупой еще и потому, что форм может быть несколько. Точнее даже не может быть, а их как правило несколько. И в каждой статусы хранить тоже не айс, тем более если нада будет что-то изменить или добавить.
Вот.
Пришла еще одна мысль. Может вообще отдельный класс завести для таких целей? Который будет статическими методами возвращать нужное. Что-то вроде:
<?php

namespace app\models\galleries;

use Yii;

use app\models\galleries\Gallery;

class GalleryStatuses 
{
    public static $coloredStatuses = [
        Gallery::STATUS_INACTIVE => '<span class="text-status brown">Не активно</span>',
        Gallery::STATUS_ACTIVE => '<span class="text-status green">Активно</span>',
        Gallery::STATUS_PROCESS => '<span class="text-status purple">В обработке</span>',
        Gallery::STATUS_ERROR => '<span class="text-status brown">Ошибка</span>',
        Gallery::STATUS_IMPORTED => '<span class="text-status orange">Импортировано</span>',
        Gallery::STATUS_DELETED => '<span class="text-status brown">Удалено</span>',
    ];

    public static function getColoredStatus(int $status) :string
    {
        return isset(self::$coloredStatuses[$status]) ? self::$coloredStatuses[$status] : 'unknown';
    }
}

Что вы думаете по этому поводу? Как вообще люди поступают в таких случаях (имею в виду не тех, что пишут гайды)?
  • Вопрос задан
  • 285 просмотров
Пригласить эксперта
Ответы на вопрос 1
Sanasol
@Sanasol
нельзя просто так взять и загуглить ошибку
С чего вы взяли что это кешируется?
Кешируются данные модели, а не все её функции с потрохами. Никаких кешей не хватило бы держать для каждой модели одни и те же функции...
Ответ написан
Ваш ответ на вопрос

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

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