Supposons que je vais avoir la Doctrine suivante 2 entité:Constantes dans Doctrine 2 entités
/**
* @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;
}
L'utilisateur peut avoir plusieurs états, par exemple: En attente, actif, suspendu. Ces statuts sont nécessaires dans tout le code (services, référentiels, etc.) et également dans la couche d'interface utilisateur (un formulaire d'édition utilisateur les affiche dans une liste déroulante).
Afin d'éviter les définir en plusieurs endroits, ce que je l'ai fait jusqu'à présent était d'utiliser une classe pour les tenir tous (toutes les constantes de l'application), et il ressemble un peu à ceci:
class App_Constants extends Zrzr_Constants
{
protected static $_constants = array(
'users' => array(
'status' => array(
0 => 'Pending',
1 => 'Active',
2 => 'Suspended')));
}
La classe de base (Zrzr_Constants) offrirait des méthodes pour les récupérer, et il ressemble à ceci:
class Zrzr_Constants
{
protected static $_constants = array();
public static function getConstantValues($key, $subkey)
{
// ...
}
public static function getConstantByName($name)
{
// ...
}
}
utilisation commune serait:
// 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');
Bien sûr, cela signifie qu'il y a certaines limitations dans le fait que les étiquettes constantes ne peuvent pas contenir de points, mais je peux vivre avec. Cependant, en utilisant Doctrine 2 et en suivant la méthode DDD, on me dit que le champ 'status' devrait être en fait un 'objet valeur' (mais Doctrine 2 ne supporte pas encore les objets de valeur), ou du moins que je devrais avoir les constantes définies dans l'entité (en utilisant const).
Ma question est comment est-ce que je ferais ceci afin que j'évite la redéfinition constante pour la couche d'interface utilisateur? J'ai besoin d'avoir accès à la constante par son nom (dans le code) et d'avoir toutes les valeurs possibles pour un tel champ dans le cas d'une liste déroulante de l'interface utilisateur (par exemple).
Votre vue est le seul endroit qui a besoin des noms.La couche UI devrait faire toute la conversion entre les noms et les valeurs; partout ailleurs devrait simplement utiliser la valeur entière. Il peut être utile d'ajouter des méthodes à votre entité comme 'isPending()' – rojoca
@rojoca - Lorsque vous dites 'utiliser la valeur entière', cela ne signifie certainement pas: 'if ($ user-> getStatus() = = 2) ... '. L'interface utilisateur n'est peut-être pas la seule autre couche utilisant ces constantes. Qu'en est-il de ces constantes utilisées dans les requêtes qui ne passent pas par le modèle de domaine (lorsqu'on utilise une sorte de CQS)? – Ghola
Non; Dans votre exemple, je pense que 'if ($ user-> isPending())' est meilleur car il dit exactement ce que cela signifie. Vous pouvez créer des constantes comme 'User :: STATUS_PENDING' dans votre modèle de domaine, puis les utiliser dans' App_Constants', par exemple 'User :: STATUS_PENDING => 'Pending''. App_Constants dépend de votre domaine, que vous codiez en dur les valeurs (comme vous le faites actuellement) ou que vous utilisiez des constantes de classe; vous pourriez aussi bien utiliser des constantes. – rojoca