Я собираюсь предположить, что вам нужно подтверждение для настойчивости.
Не только View, но Model также не должны обрабатывать валидацию. За время работы в ИТ я понял, что DDD - это один из способов убедиться, что вы действительно делаете все правильно, т.е. классы на самом деле отвечают за то, что они должны быть.
Следуя доменно-управляемому дизайну, ваши модели включают вашу бизнес-логику, и это все. Но они не включают в себя проверку, почему бы и нет?
Давайте предположим , что вы уже так далеки , что вы используете Data Mapperвместо Active Recordупорствовать ваш домен слой. Но все же вы хотите, чтобы модели были проверены, поэтому вы добавляете проверку к вашей Модели.
interface Validation
{
public function validate();
}
class ConcreteModel extends MyModel implements Validation
{
public function validate() { // the validation logic goes here }
}
Логика проверки гарантирует, что вы можете правильно вставить модель в свою базу данных MySQL ... Прошло несколько месяцев, и вы решили, что хотите также хранить свои модели в базах данных noSQL, базах данных, для которых требуются другие правила проверки, чем в MySQL.
Но у вас есть проблема, у вас есть только один метод проверки, но вам нужно проверить его Modelдвумя разными способами.
Модели должны делать то, что они несут ответственность , они должны заботиться о вашей бизнес-логике и делать это хорошо. Валидация связана с постоянством, а не с бизнес-логикой, поэтому валидация не относится к модели .
ValidatorВместо этого вы должны создать s, который примет модель для проверки в своем конструкторе в качестве параметра, реализует Validationинтерфейс и использует эти Validators для проверки ваших объектов.
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
}
}
Если в любое время в будущем вы решите добавить другой метод проверки для другого уровня персистентности (поскольку вы решили, что Redis и MySQL больше не подходят), вы просто создадите другой Validatorи будете использовать свой IoCконтейнер, чтобы получить правильный экземпляр на основе на вашем config.