Vou assumir que você precisa de validação para persistência.
Não apenas View, mas Model também não deve lidar com validação. Durante meus dias na área de TI, percebi que o DDD é uma das maneiras de garantir que você esteja realmente fazendo as coisas corretamente, ou seja. as classes são realmente responsáveis pelo que deveriam ser.
Ao seguir o design orientado a domínio, seus modelos incluem sua lógica de negócios, e é isso. Mas eles não incluem validação, por que não?
Vamos supor que você já esteja tão longe quanto está usando, em Data Mappervez de Active Recordpersistir na camada de domínio. Ainda assim, você deseja que os modelos sejam validados, portanto, adicione a validação ao seu modelo.
interface Validation
{
public function validate();
}
class ConcreteModel extends MyModel implements Validation
{
public function validate() { // the validation logic goes here }
}
A lógica de validação garante que você possa inserir corretamente o modelo no seu banco de dados MySQL ... Alguns meses se passam e você decide que deseja armazenar seus modelos também nos bancos de dados noSQL, bancos de dados que exigem regras de validação diferentes das do MySQL.
Mas você tem um problema, você tem apenas 1 método de validação, mas precisa validar um Modelde 2 maneiras diferentes.
Os modelos devem fazer o que são responsáveis , cuidar da lógica de negócios e fazê-lo bem. A validação está ligada à persistência, não à lógica de negócios, portanto validação não pertence a um modelo .
Você deve criar Validators, que usará um modelo para validar em seu construtor como parâmetro, implementar a Validationinterface e usá-los Validatorpara validar seus objetos.
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 a qualquer momento no futuro decidir que você deseja adicionar outro método de validação para outra camada de persistência (porque você decidiu que Redis e MySQL não são mais o caminho), você apenas criará outro Validatore usará seu IoCcontêiner para obter a instância correta. no seu config.