Zakładam, że potrzebujesz potwierdzenia dla wytrwałości.
Nie tylko widok, ale także model nie powinien obsługiwać sprawdzania poprawności. Podczas moich dni w IT zdałem sobie sprawę, że DDD jest jednym ze sposobów, aby upewnić się, że faktycznie postępujesz właściwie, tj. klasy są faktycznie odpowiedzialne za to, czym powinny być.
Modele oparte na projektach opartych na domenie zawierają logikę biznesową i to wszystko. Ale nie obejmują one weryfikacji, dlaczego nie?
Załóżmy, że jesteś już tak daleko, jak używasz, Data Mapper
zamiast Active Record
utrzymywać warstwę domeny. Ale nadal chcesz, aby modele były sprawdzane, więc dodajesz sprawdzanie poprawności do swojego modelu.
interface Validation
{
public function validate();
}
class ConcreteModel extends MyModel implements Validation
{
public function validate() { // the validation logic goes here }
}
Logika sprawdzania poprawności gwarantuje, że możesz poprawnie wstawić model do bazy danych MySQL ... Minęło kilka miesięcy i zdecydowałeś, że chcesz przechowywać Modele również w bazach danych noSQL, bazach danych, które wymagają innych reguł sprawdzania poprawności niż MySQL.
Ale masz problem, masz tylko 1 metodę sprawdzania poprawności, ale musisz zweryfikować na Model
2 różne sposoby.
Modele powinny robić to, za co są odpowiedzialne , dbać o logikę biznesową i robić to dobrze. Walidacja jest związana z trwałością, a nie logiką biznesową, dlatego walidacja nie należy do modelu .
Zamiast tego powinieneś utworzyć Validator
s, który weźmie model do sprawdzenia w swoim konstruktorze jako parametr, zaimplementuje Validation
interfejs i użyje tych Validator
s do sprawdzenia poprawności twoich obiektów.
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
}
}
Jeśli w przyszłości zdecydujesz, że chcesz dodać kolejną metodę sprawdzania poprawności dla kolejnej warstwy trwałości (ponieważ zdecydowałeś, że Redis i MySQL nie są już właściwą drogą), po prostu utworzysz inną Validator
i użyjesz IoC
kontenera, aby uzyskać odpowiednią instancję na twoim config
.