Tôi sẽ giả định rằng bạn cần xác nhận cho sự kiên trì.
Không chỉ Xem, mà Mô hình cũng không nên xử lý xác nhận. Trong những ngày ở CNTT tôi đã nhận ra DDD là một trong những cách để đảm bảo bạn đang thực sự làm mọi thứ một cách chính xác, tức là. các lớp học thực sự chịu trách nhiệm cho những gì họ nên được.
Khi theo thiết kế hướng tên miền, các mô hình của bạn bao gồm logic kinh doanh của bạn và đó là nó. Nhưng chúng không bao gồm xác nhận, tại sao không?
Giả sử bạn đã sử dụng đến mức bạn đang sử dụng Data Mapper
thay vì Active Record
duy trì lớp miền của mình. Tuy nhiên, bạn vẫn muốn các mô hình được xác thực, vì vậy bạn thêm xác thực vào Mô hình của mình.
interface Validation
{
public function validate();
}
class ConcreteModel extends MyModel implements Validation
{
public function validate() { // the validation logic goes here }
}
Logic xác thực đảm bảo, bạn có thể chèn chính xác mô hình vào cơ sở dữ liệu MySQL của mình ... Vài tháng trôi qua và bạn quyết định, bạn cũng muốn lưu trữ Mô hình của mình trong cơ sở dữ liệu noQuery, cơ sở dữ liệu yêu cầu các quy tắc xác thực khác với MySQL.
Nhưng bạn có một vấn đề, bạn chỉ có 1 phương thức xác nhận, nhưng cần xác thực Model
theo 2 cách khác nhau.
Các mô hình nên làm những gì họ có trách nhiệm làm , họ nên chăm sóc logic kinh doanh của bạn và làm điều đó tốt. Xác nhận được gắn với sự kiên trì, không phải logic kinh doanh, do đó xác nhận không thuộc về một mô hình .
Validator
Thay vào đó, bạn nên tạo s, sẽ lấy một mô hình để xác thực trong hàm tạo của chúng làm tham số, triển khai Validation
giao diện và sử dụng các Validator
s này để xác thực các đối tượng của bạn.
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
}
}
Nếu bất cứ lúc nào trong tương lai quyết định bạn muốn thêm một phương thức xác thực khác cho một lớp kiên trì khác (vì bạn đã quyết định Redis và MySQL không còn cách nào nữa), bạn sẽ chỉ tạo một phương thức khác Validator
và sử dụng bộ IoC
chứa của mình để có được ví dụ phù hợp trên của bạn config
.