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