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 Mapper
vez de Active Record
persistir 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 Model
de 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 Validator
s, que usará um modelo para validar em seu construtor como parâmetro, implementar a Validation
interface e usá-los Validator
para 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 Validator
e usará seu IoC
contêiner para obter a instância correta. no seu config
.