Je vais supposer que vous avez besoin d'une validation pour la persistance.
Non seulement View, mais Model ne doit pas non plus gérer la validation. Pendant mes jours dans l'informatique, j'ai réalisé que DDD est l'un des moyens de vous assurer que vous faites les choses correctement, c'est-à-dire. les classes sont en fait responsables de ce qu'elles devraient être.
Lorsque vous suivez une conception pilotée par domaine, vos modèles incluent votre logique métier, et c'est tout. Mais ils n'incluent pas la validation, pourquoi pas?
Supposons que vous êtes déjà aussi loin que vous utilisez Data Mapperau lieu de Active Recordconserver votre couche de domaine. Mais malgré tout, vous voulez que les modèles soient validés, vous ajoutez donc la validation à votre modèle.
interface Validation
{
public function validate();
}
class ConcreteModel extends MyModel implements Validation
{
public function validate() { // the validation logic goes here }
}
La logique de validation garantit que vous pouvez correctement insérer le modèle dans votre base de données MySQL ... Quelques mois passent et vous décidez, vous voulez également stocker vos modèles dans des bases de données noSQL, des bases de données, qui nécessitent des règles de validation différentes de MySQL.
Mais vous avez un problème, vous n'avez qu'une seule méthode de validation, mais vous devez en valider une Modelde 2 manières différentes.
Les modèles doivent faire ce qu'ils sont chargés de faire , ils doivent prendre soin de votre logique métier et bien le faire. La validation est liée à la persistance et non à la logique métier, la validation n'appartient donc pas à un modèle .
Vous devez Validatorplutôt créer des s, qui prendront un modèle à valider dans leur constructeur en tant que paramètre, implémenteront l' Validationinterface et les utiliseront Validatorpour valider vos objets.
interface Validation
{
public function validate();
}
class MySQLConcreteModelValidator implements Validation
{
public function __construct(ConcreteModel $model) { }
public function validate()
{
// you validate your model here
}
}
class RedisConcreteModelValidator implements Validation
{
public function __construct(ConcreteModel $model) { }
public function validate()
{
// you validate your model with different set of rules here
}
}
Si à tout moment dans le futur vous décidez d'ajouter une autre méthode de validation pour une autre couche de persistance (parce que vous avez décidé que Redis et MySQL ne sont plus la voie à suivre), vous allez simplement en créer une autre Validatoret utiliser votre IoCconteneur pour obtenir la bonne instance en fonction sur votre config.