我将假设您需要对持久性进行验证。
不仅View,而且Model也不应处理验证。在从事IT的那几天,我意识到DDD是确保您实际上在正确执行操作的一种方法,即。类实际上负责它们应该是什么。
在遵循域驱动设计时,您的模型包括您的业务逻辑,就是这样。但是它们不包括验证,为什么不呢?
假设您已经在使用远距离Data Mapper
而不是Active Record
持久化域层。但是,您仍然希望对模型进行验证,因此可以将验证添加到模型中。
interface Validation
{
public function validate();
}
class ConcreteModel extends MyModel implements Validation
{
public function validate() { // the validation logic goes here }
}
验证逻辑可确保您可以将模型正确地插入MySQL数据库中……几个月后,您决定将模型也存储在noSQL数据库中,这些数据库需要与MySQL不同的验证规则。
但是您有一个问题,您只有一种验证方法,但是需要以Model
两种不同的方式进行验证。
模型应该做他们应该做的事情,应该照顾好您的业务逻辑并做好。验证与持久性相关,而不与业务逻辑相关,因此验证不属于模型。
您应该Validator
改为创建,它将使用模型在其构造函数中进行验证作为参数,实现Validation
接口并使用这些Validator
来验证对象。
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
}
}
如果将来在任何时候决定要为另一个持久层添加另一种验证方法(因为您确定Redis和MySQL不再可行),您将创建另一个Validator
并使用您的IoC
容器基于正确的实例在你的config
。