Страница 1 из 1

Хранение списков констант

Добавлено: 2014.09.08, 08:57
6pblcb
Привет всем :)
Хочу увидеть чужой опыт хранения списка констант.

Вот пример на Yii2, что бы было нагляднее:

Код: Выделить всё

namespace common\models\base;

class Page extends \yii\db\ActiveRecord
{
    const TYPE_PRODUCT_VALUE = 1;
    const TYPE_PRODUCT_TEXT  = 'Product';

    const TYPE_COLLECTION_VALUE = 2;
    const TYPE_COLLECTION_TEXT  = 'Collection';

    const TYPE_EDITORIAL_VALUE = 3;
    const TYPE_EDITORIAL_TEXT  = 'Editorial';

    const TYPE_NEWS_VALUE = 4;
    const TYPE_NEWS_TEXT  = 'News';

    const TYPE_FEATURE_VALUE = 5;
    const TYPE_FEATURE_TEXT  = 'Feature';

    const TYPE_GENERIC_VALUE = 6;
    const TYPE_GENERIC_TEXT  = 'Generic Page';

    public static function typesByValue() {
        return [
            self::TYPE_PRODUCT_VALUE    => self::TYPE_PRODUCT_TEXT,
            self::TYPE_COLLECTION_VALUE => self::TYPE_COLLECTION_TEXT,
            self::TYPE_EDITORIAL_VALUE  => self::TYPE_EDITORIAL_TEXT,
            self::TYPE_NEWS_VALUE       => self::TYPE_NEWS_TEXT,
            self::TYPE_FEATURE_VALUE    => self::TYPE_FEATURE_TEXT,
            self::TYPE_GENERIC_VALUE    => self::TYPE_GENERIC_TEXT,
        ];
    }
    
    public static function typesByText() {
        return array_flip(static::typesByValue());
    }

    public static function getTypeNameByValue($value, $default = null)
    {
        return ArrayHelper::getValue(static::typesByValue(), $value, $default);
    }

    public static function getTypeValueByName($name, $default = null)
    {
        return ArrayHelper::getValue(static::typesByText(), $name, $default);
    }
...
}
Это реальный пример. Используется всё, что есть в примере. Беда в том, что ~40 строк ушло только на 1 список =\ Разбиваю модели на "common\models\base\Page", "common\models\Page" и ещё 2 "Page" во "frontend" и "backend". В "base" попадают константы, tableName(), relations, etc.

Для Yii1, я для себя в рамках одного проекта писал модуль с админкой, который хранил всё это дело в базе и при debug=false, всё хорошенько навечно кэшировал в APC и оперативной памяти в рамках одного скрипта. Было порядка 200 списков для моделей.
Был хелпер примерно с такими методами (пишу на память исходника нет под рукой):

Код: Выделить всё

//Для получения "констант"
SetHelper::getValue($name, $text, $default = null);
SetHelper::getText($name, $value, $default = null);

//Для получения списка 
SetHelper::getTextValue($name, $sort = null, $direction = 'ASC'); //return ['Text' => 1 ...]
SetHelper::getValueText($name, $prompt = null, $sort = null, $direction = 'ASC'); //return [1 => 'Text' ...]
//Ещё были методы для получения алиасов текста, которые также хранились в базе и кэшировались (в примере выше нет алиасов)
 
Подумываю перенести код на YIi2.
Выше я рассказал свои спрособы.

Вопрос: как такое храните Вы?
ps: если вдруг "также", буду признателен за ответ -> "также" :)

Re: Хранение списков констант

Добавлено: 2014.09.08, 09:00
SiZE
Текст в константах явно лишний.

Re: Хранение списков констант

Добавлено: 2014.09.08, 09:05
6pblcb
Спорное утверждение, без контекста задачи. Часто текст не нужен, но в том примере надо.

Re: Хранение списков констант

Добавлено: 2014.09.08, 10:06
SiZE
6pblcb писал(а):Спорное утверждение, без контекста задачи. Часто текст не нужен, но в том примере надо.
Для того чтобы увидеть использование не по назначению никаких контекстов не нужно. Это грубо говоря если ты в ванную вместо туалета будешь ходить. В рамках задачи, все сливается в канализацию.

Достаточно такой реализации

Код: Выделить всё

const CODE = 100;

function getCodesList(){
  return array( self::CODE => 'Code' );
}

function getCodeValue( $code ){
  $list = $this->getCodesList();
  return array_key_exists( $code, $list ) ? $list[ $code ] : 'unknown';
}
P.S. Для расширения моего кругозора, опиши заду при которой надо возвращать ключ твоего массива по текстовому полю?

Re: Хранение списков констант

Добавлено: 2014.09.08, 11:59
samdark
Я так делаю:

Код: Выделить всё

namespace common\models\base;

class Page extends \yii\db\ActiveRecord
{
    const TYPE_PRODUCT = 1;
    const TYPE_COLLECTION = 2;
    const TYPE_EDITORIAL = 3;
    const TYPE_NEWS = 4;
    const TYPE_FEATURE = 5;
    const TYPE_GENERIC = 6;

    public static function getTypes()
    {
        return [
            TYPE_PRODUCT => 'Product',
            TYPE_COLLECTION => 'Collection',
            TYPE_EDITORIAL => 'Editorial',
            TYPE_NEWS => 'News',
            TYPE_FEATURE => 'Feature',
            TYPE_GENERIC => 'Generic Page',
        ];
    }
    
    public static function getTypeLabel($type, $default = null)
    {
        $types = static::getTypes();
        return isset($types[$type]) ? $types[$type] : $default; 
    }
}
 

Re: Хранение списков констант

Добавлено: 2014.09.08, 14:14
mickgeek
Моя функция:

Код: Выделить всё

const TYPE_NORMAL = 10;
const TYPE_FOR_COLLECTION = 11;

const STATUS_INACTIVE = 0;
const STATUS_PENDING = 1;
const STATUS_APPROVED = 10;

/**
 * Returns list aliases of the specified item.
 *
 * @param string $type the item type.
 * @param string $key the key of the item alias.
 * @param array|string $exclude excluded item aliases or the specific item alias.
 * @return array|string item aliases or the specific item alias.
 */
public static function getItemAlias($type, $key = null, $exclude = null)
{
    $items = [];
    $items['type'] = [
        self::TYPE_NORMAL => 'Normal',
        self::TYPE_FOR_COLLECTION => 'For Collection',
    ];
    $items['status'] = [
        self::STATUS_INACTIVE => 'Inactive',
        self::STATUS_PENDING => 'Pending',
        self::STATUS_APPROVED => 'Approved',
    ];

    if ($exclude !== null) {
        if (is_array($exclude)) {
            foreach ($exclude as $excluded) {
                unset($items[$type][$excluded]);
            }
        } else {
            unset($items[$type][$exclude]);
        }
    }

    return $key === null ? $items[$type] : $items[$type][$key];
} 

Код: Выделить всё

<?= $form->field($model, 'status')->dropDownList($model->getItemAlias('status', null,
    $model->isNewRecord ? $model::STATUS_PENDING : null
)) ?>

Re: Хранение списков констант

Добавлено: 2014.12.28, 15:52
Arroyo
Sam Dark писал(а):Я так делаю:

Код: Выделить всё

namespace common\models\base;

class Page extends \yii\db\ActiveRecord
{
    const TYPE_PRODUCT = 1;
    const TYPE_COLLECTION = 2;
    const TYPE_EDITORIAL = 3;
    const TYPE_NEWS = 4;
    const TYPE_FEATURE = 5;
    const TYPE_GENERIC = 6;

    public static function getTypes()
    {
        return [
            TYPE_PRODUCT => 'Product',
            TYPE_COLLECTION => 'Collection',
            TYPE_EDITORIAL => 'Editorial',
            TYPE_NEWS => 'News',
            TYPE_FEATURE => 'Feature',
            TYPE_GENERIC => 'Generic Page',
        ];
    }
    
    public static function getTypeLabel($type, $default = null)
    {
        $types = static::getTypes();
        return isset($types[$type]) ? $types[$type] : $default; 
    }
}
 

Подскажите, как выводить значение константы, вместо ключа в view.php ? (например Collection вместо 2)

Re: Хранение списков констант

Добавлено: 2014.12.29, 09:20
Arroyo
Arroyo писал(а):Подскажите, как выводить значение константы, вместо ключа в view.php ? (например Collection вместо 2)
Разобрался

Код: Выделить всё

[
     'attribute' => 'Тип',
     'value' => $model->getTypes()[$model->type]
],