Kalıcılık için doğrulamaya ihtiyacınız olduğunu varsayacağım.
Sadece Görünüm değil, Model de doğrulamayı işlememelidir. BT'deki günlerim boyunca DDD'nin aslında işleri doğru bir şekilde yaptığınızdan emin olmanın yollarından biri olduğunu fark ettim . sınıflar aslında olması gereken şeylerden sorumludur.
Etki Alanına Dayalı tasarımı takip ederken, modelleriniz iş mantığınızı içerir ve hepsi bu kadar. Ancak doğrulama içermiyorlar, neden olmasın?
Etki alanı katmanınızı sürdürmek Data Mapper
yerine zaten kullandığınız kadar uzak olduğunuzu varsayalım Active Record
. Ancak yine de, modellerin doğrulanmasını istiyorsunuz, bu nedenle Modelinize doğrulamayı ekliyorsunuz.
interface Validation
{
public function validate();
}
class ConcreteModel extends MyModel implements Validation
{
public function validate() { // the validation logic goes here }
}
Doğrulama mantığı, modeli MySQL veritabanınıza doğru bir şekilde ekleyebilmenizi sağlar ... Birkaç ay geçer ve siz karar verirseniz, Modellerinizi noSQL veritabanlarında, MySQL'den farklı doğrulama kuralları gerektiren veritabanlarında depolamak istersiniz.
Ancak bir sorununuz var, yalnızca 1 doğrulama yönteminiz var, ancak a'yı Model
2 farklı şekilde doğrulamanız gerekiyor .
Modeller yapmaktan sorumlu olduklarını yapmalı , iş mantığınıza dikkat etmeli ve iyi yapmalıdır. Doğrulama, iş mantığına değil kalıcılığa bağlıdır, dolayısıyla doğrulama bir modele ait değildir .
Bunun Validator
yerine, kurucularında parametre olarak doğrulamak için bir model alacak, Validation
arabirimi uygulayacak ve Validator
nesnelerinizi doğrulamak için bu s'yi kullanacak bir s oluşturmanız gerekir.
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
}
}
Gelecekte herhangi bir zamanda başka bir kalıcılık katmanı için başka bir doğrulama yöntemi eklemek istediğinize karar verirseniz (Redis ve MySQL'in artık gitme yolu olmadığına karar verdiğiniz için), sadece başka bir tane oluşturacak Validator
ve IoC
doğru örneği almak için kapsayıcıyı kullanacaksınız. sizin config
.