Presumo che tu abbia bisogno di una convalida per la persistenza.
Non solo View, ma anche Model non dovrebbe gestire la validazione. Durante i miei giorni in IT ho capito che DDD è uno dei modi per assicurarti che tu stia effettivamente facendo le cose correttamente, cioè. le classi sono effettivamente responsabili di ciò che dovrebbero essere.
Quando segui la progettazione basata su dominio, i tuoi modelli includono la tua logica aziendale, e basta. Ma non includono la convalida, perché no?
Supponiamo che tu stia già utilizzando e Data Mapper
non Active Record
per mantenere il tuo livello di 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 convalida garantisce che puoi inserire correttamente il modello nel tuo database MySQL ... Passano alcuni mesi e decidi che vuoi archiviare i tuoi modelli anche in database noSQL, database, che richiedono regole di convalida diverse rispetto a MySQL.
Ma hai un problema, hai solo 1 metodo di convalida, ma devi convalidare a Model
in 2 modi diversi.
I modelli dovrebbero fare ciò che sono responsabili , dovrebbero prendersi cura della propria logica aziendale e farlo bene. La convalida è legata alla persistenza, non alla logica aziendale, quindi la convalida non appartiene a un modello .
Dovresti Validator
invece creare s, che richiederà un modello per convalidare il loro costruttore come parametro, implementare l' Validation
interfaccia 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), ne creerai semplicemente un altro Validator
e utilizzerai il tuo IoC
contenitore per ottenere l'istanza giusta in base sul tuo config
.