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 Mapperanstatt Active RecordIhre 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 Modelzwei 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 Validatorstattdessen s erstellen , das ein Modell zur Validierung in seinem Konstruktor als Parameter verwendet, die ValidationSchnittstelle implementiert und diese Validators 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 Validatorund verwenden Ihren IoCContainer, um die richtige Instanz zu erhalten auf deine config.