Ich gehe davon aus, dass Sie eine Validierung für die Persistenz benötigen.
Nicht nur Ansicht, sondern auch Modell sollte auch nicht validiert werden. Während meiner IT-Tage wurde mir klar, dass DDD eine der Möglichkeiten ist, um sicherzustellen, dass Sie die Dinge tatsächlich richtig machen, d. H. Klassen sind tatsächlich dafür verantwortlich, was sie sein sollten.
Wenn Sie dem domänengesteuerten Design folgen, enthalten Ihre Modelle Ihre Geschäftslogik, und das ist es. Aber sie beinhalten keine Validierung, warum nicht?
Nehmen wir an, Sie sind bereits so weit, wie Sie verwenden, Data Mapper
anstatt Active Record
Ihre Domain-Schicht beizubehalten. Sie möchten jedoch, dass Modelle validiert werden, und fügen die Validierung Ihrem Modell hinzu.
interface Validation
{
public function validate();
}
class ConcreteModel extends MyModel implements Validation
{
public function validate() { // the validation logic goes here }
}
Die Validierungslogik stellt sicher, dass Sie das Modell korrekt in Ihre MySQL-Datenbank einfügen können ... Nach einigen Monaten möchten Sie Ihre Modelle auch in noSQL-Datenbanken speichern, in denen andere Validierungsregeln als in MySQL erforderlich sind.
Sie haben jedoch ein Problem, Sie haben nur eine Validierungsmethode, müssen diese jedoch auf Model
zwei verschiedene Arten validieren .
Die Modelle sollten das tun, wofür sie verantwortlich sind , sie sollten sich um Ihre Geschäftslogik kümmern und es gut machen. Die Validierung ist an die Persistenz gebunden, nicht an die Geschäftslogik. Daher gehört die Validierung nicht zu einem Modell .
Sie sollten Validator
stattdessen s erstellen , das ein Modell zur Validierung in seinem Konstruktor als Parameter verwendet, die Validation
Schnittstelle implementiert und diese Validator
s zur Validierung Ihrer Objekte verwendet.
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
}
}
Wenn Sie zu einem späteren Zeitpunkt entscheiden, dass Sie eine weitere Validierungsmethode für eine andere Persistenzschicht hinzufügen möchten (weil Sie entschieden haben, dass Redis und MySQL nicht mehr der richtige Weg sind), erstellen Sie einfach eine andere Validator
und verwenden Ihren IoC
Container, um die richtige Instanz zu erhalten auf deine config
.