지속성에 대한 유효성 검사가 필요하다고 가정합니다.
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 데이터베이스에 올바르게 삽입 할 수 있습니다. 몇 개월이 지나면 MySQL과는 다른 유효성 검사 규칙이 필요한 noSQL 데이터베이스뿐만 아니라 데이터베이스에도 모델을 저장하려고합니다.
그러나 문제가 있습니다. 검증 방법은 하나 뿐이지 만 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
}
}
나중에 언제라도 다른 지속성 계층에 대해 다른 유효성 검사 방법을 추가하기로 결정한 경우 (Reds와 MySQL이 더 이상 갈 길이 없다고 판단했기 때문에) 다른 인스턴스를 만들고 컨테이너를 Validator
사용하여 IoC
올바른 인스턴스 기반을 얻습니다. 당신의 config
.