Ho intenzione di ritenere che sia necessaria la convalida per la persistenza.
Non solo Visualizza, ma Model non dovrebbe gestire neanche la validazione. Durante i miei giorni in IT mi sono reso conto che DDD è uno dei modi per garantire che tu stia effettivamente facendo le cose correttamente, ad es. le classi sono effettivamente responsabili di ciò che dovrebbero essere.
Se segui la progettazione basata sul dominio, i tuoi modelli includono la tua logica aziendale, e questo è quanto. Ma non includono la convalida, perché no?
Supponiamo che tu sia già tanto lontano che stai usando Data Mapper
invece di Active Record
per mantenere il tuo livello dominio. Tuttavia, vuoi che i modelli vengano convalidati, quindi aggiungi la convalida al tuo Modello.
interface Validation
{
public function validate();
}
class ConcreteModel extends MyModel implements Validation
{
public function validate() { // the validation logic goes here }
}
La logica di validazione garantisce, puoi inserire correttamente il modello nel tuo database MySQL ... Passano alcuni mesi e tu decidi, vuoi memorizzare i tuoi Modelli anche in database noSQL, database, che richiedono regole di convalida diverse da MySQL .
Ma hai un problema, hai solo 1 metodo di convalida, ma devi convalidare un Model
in 2 modi diversi.
I modelli dovrebbero fare ciò che sono responsabili di fare , devono prendersi cura della propria logica di business e farlo bene . La convalida è legata alla persistenza, non alla logica aziendale, quindi la convalida non appartiene a un modello .
Dovresti invece creare Validator
s, che richiederà un modello per convalidare il costruttore come parametro, implementare l'interfaccia Validation
e usare questi Validator
s per convalidare i tuoi oggetti.
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
}
}
Se in qualsiasi momento in futuro deciderai di voler aggiungere un altro metodo di convalida per un altro livello di persistenza (perché hai deciso che Redis e MySQL non sono più la strada da percorrere), creerai un altro Validator
e userai la tua IoC
container per ottenere l'istanza corretta in base al config
.