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 Mapper
au lieu de Active Record
conserver 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 Model
de 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 Validator
plutôt créer des s, qui prendront un modèle à valider dans leur constructeur en tant que paramètre, implémenteront l' Validation
interface et les utiliseront Validator
pour 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 Validator
et utiliser votre IoC
conteneur pour obtenir la bonne instance en fonction sur votre config
.