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

Темы, не касающиеся фреймворка, но относящиеся к программированию в целом.
Ответить
6pblcb
Сообщения: 71
Зарегистрирован: 2012.03.02, 11:24
Откуда: Omsk

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

Сообщение 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: если вдруг "также", буду признателен за ответ -> "также" :)
YII2?, начинаю продолжать заканчивать делать. I'm gonna go build my own php-framework, with blackjack and hookers. In fact, forget the php-framework!
Аватара пользователя
SiZE
Сообщения: 2813
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

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

Сообщение SiZE »

Текст в константах явно лишний.
6pblcb
Сообщения: 71
Зарегистрирован: 2012.03.02, 11:24
Откуда: Omsk

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

Сообщение 6pblcb »

Спорное утверждение, без контекста задачи. Часто текст не нужен, но в том примере надо.
YII2?, начинаю продолжать заканчивать делать. I'm gonna go build my own php-framework, with blackjack and hookers. In fact, forget the php-framework!
Аватара пользователя
SiZE
Сообщения: 2813
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

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

Сообщение 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. Для расширения моего кругозора, опиши заду при которой надо возвращать ключ твоего массива по текстовому полю?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

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

Сообщение 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; 
    }
}
 
mickgeek
Сообщения: 957
Зарегистрирован: 2014.05.31, 20:50
Откуда: Санкт-Петербург
Контактная информация:

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

Сообщение 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
)) ?>
Arroyo
Сообщения: 105
Зарегистрирован: 2014.11.29, 11:24

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

Сообщение 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)
Arroyo
Сообщения: 105
Зарегистрирован: 2014.11.29, 11:24

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

Сообщение Arroyo »

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

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

[
     'attribute' => 'Тип',
     'value' => $model->getTypes()[$model->type]
], 
Ответить