Saya akan menganggap Anda perlu validasi untuk kegigihan.
Tidak hanya Lihat, tetapi Model juga tidak boleh menangani validasi. Selama hari-hari saya di IT saya menyadari DDD adalah salah satu cara untuk memastikan Anda benar-benar melakukan sesuatu dengan benar, yaitu. kelas sebenarnya bertanggung jawab atas apa yang seharusnya.
Saat mengikuti desain Domain-Driven, model Anda menyertakan logika bisnis Anda, dan hanya itu. Tetapi mereka tidak memasukkan validasi, mengapa tidak?
Mari kita asumsikan Anda sudah sejauh yang Anda gunakan Data Mapper
daripada Active Record
bertahan lapisan domain Anda. Tapi tetap saja, Anda ingin model divalidasi, jadi Anda menambahkan validasi ke Model Anda.
interface Validation
{
public function validate();
}
class ConcreteModel extends MyModel implements Validation
{
public function validate() { // the validation logic goes here }
}
Logika validasi memastikan, Anda dapat memasukkan model dengan benar ke dalam basis data MySQL Anda ... Beberapa bulan berlalu dan Anda memutuskan, Anda ingin menyimpan Model Anda di basis data noSQL juga, basis data, yang memerlukan aturan validasi berbeda dari MySQL.
Tetapi Anda memiliki masalah, Anda hanya memiliki 1 metode validasi, tetapi perlu memvalidasi Model
dalam 2 cara berbeda.
Model harus melakukan apa yang mereka harus lakukan , mereka harus menjaga logika bisnis Anda dan melakukannya dengan baik. Validasi terkait dengan kegigihan, bukan logika bisnis, karenanya validasi bukan milik model .
Anda harus membuat Validator
s, yang akan mengambil model untuk memvalidasi dalam konstruktor mereka sebagai parameter, mengimplementasikan Validation
antarmuka dan menggunakan ini Validator
untuk memvalidasi objek Anda.
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
}
}
Jika suatu saat di masa depan memutuskan Anda ingin menambahkan metode validasi lain untuk lapisan kegigihan lainnya (karena Anda memutuskan Redis dan MySQL bukan cara untuk pergi lagi), Anda hanya akan membuat yang lain Validator
dan menggunakan IoC
wadah Anda untuk mendapatkan instance yang tepat berdasarkan pada Anda config
.