Константы в объектах Doctrine 2

Предположим, у меня есть следующая сущность Doctrine 2:

/**
 * @ORM\Entity
 * @ORM\Table(name="users")
 */
class User {

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue
     *
     * @var int
     */
    protected $id;

    /**
     * @ORM\Column(length=100)
     *
     * @var string
     */
    protected $name;

    /**
     * @ORM\Column(type="integer")
     *
     * @var int
     */
    protected $status;
}

Пользователь может имеют несколько статусов, например: Ожидание, Активно, Приостановлено. Эти статусы необходимы во всем коде (службы, репозитории и т. Д.), А также на уровне пользовательского интерфейса (форма редактирования пользователя отобразит их в раскрывающемся списке).

Чтобы избежать определения их в нескольких местах, я до сих пор использовал класс для хранения их всех (всех констант приложения), и это выглядит примерно так:

class App_Constants extends Zrzr_Constants
{

    protected static $_constants = array( 
        'users' => array( 
            'status' => array( 
                0 => 'Pending', 
                1 => 'Active',
                2 => 'Suspended' ) ) );

}

Базовый класс ( Zrzr_Constants) предлагает несколько методов для их получения, и это выглядит так:

class Zrzr_Constants
{
    protected static $_constants = array();

    public static function getConstantValues( $key, $subkey )
    {
        // ...
    }

    public static function getConstantByName( $name )
    {
        // ...
    }
}

Обычно используется:

// example of retrieval by constant name ... it would return an integer
$pendingStatus = App_Constants::getConstantByName( 'USERS.STATUS.PENDING' );

// example of retrieval for UI display purposes ... would return an array
$statuses = App_Constants::getConstantValues('users', 'status');

Конечно, это означает, что есть некоторые ограничения в том, что метки констант не могут содержать точки, но я могу жить с это.

Однако использование Doctrine 2 и использование DDD подсказывает мне, что поле 'status' должно быть фактически 'объектом значения' (но Doctrine 2 еще не поддерживает объекты значений) или, по крайней мере, что я должен иметь константы, определенные внутри объекта (с помощью const).

У меня вопрос: как это сделать, чтобы избежать постоянного переопределения уровня пользовательского интерфейса? Мне нужно иметь доступ к константе по имени (в коде) и иметь все возможные значения для такого поля в случае раскрывающегося меню пользовательского интерфейса (например).

7
задан Ghola 1 August 2011 в 13:05
поделиться