Некоторое время назад я начал играть с DDD. На данный момент все мои занятия — ПОПО. Почти все завершено, но я хотел бы проверить свои сущности перед сохранением.
Я уже знаю, где поставить валидацию (команды / объекты прецедента), но в идеале я хотел бы использовать сервис валидатора на уровне приложений / инфраструктуры. Для меня валидация должна быть частью уровня домена, но если я добавлю его, у меня будет много дубликатов.
Сталкивались ли вы с такой проблемой? Есть ли разумное решение для этого? Спасибо за все!
Не смешивайте типы проверок, я знаю, что это сбивает с толку, и нелегко разделить понятия и сделать это правильно, но не сдавайтесь.
Существуют бизнес-валидации, которые должны принадлежать вашему домену и не использовать какие-либо внешние компоненты / рамки для валидации (поскольку ваш домен должен быть максимально чистым и естественным), а также валидации приложений, которые должны проверять, является ли URL действительным, если пользователь аутентифицирован, и вы можете использовать Symphony или любой другой фреймворк / плагин, который вы хотите.
Ваш домен должен быть максимально естественным и чистым, чтобы вы могли даже показать его бизнес-аналитику и обсудить некоторые вопросы. Проверки, которые вы помещаете в свой домен, должны следовать этой концепции, что означает, что бизнес-аналитик может даже указать вам, правильна ли эта проверка, и предложить изменения, если это так. На самом деле, где я работаю, иногда даже ключевые пользователи видят домен (код и диаграммы) и указывают на вещи.
Теперь предположим, что в любом случае вы хотите проверить, является ли URL действительным в вашем домене, и не следовать Всегда действительный подход (который рекомендуется), где вы предполагаете, что прикладной уровень уже подтвердил URL для вас. Вместо этого вы хотите, чтобы внутри вашего домена была строка кода, явно пытающаяся проверить URL. Если это требование (и я против, но я даю возможное решение), я бы сделал это:
// This would belong to your domain...
interface IValidator
{
public function IsValidURL($url);
}
class Foo
{
public function SaveURL($url, $validator)
{
if (!$validator instanceof IValidator)
throw new Exception("Invalid validator providen to Foo!");
if (!$validator->IsValidURL($url))
throw new Exception("The URL $url is not valid!");
// Do logic
}
}
// ...and this to your Application Layer
class SymphonyValidator implements IValidator
{
public function IsValidURL($url)
{
// use Symphony validator or any other framework/plugin
}
}var foo = new Foo();
var validator = new SymphonyValidator();
foo->SaveURL("invalidUrl", validator);
Но имейте в виду, что это всего лишь обходной путь для вызова метода проверки в вашем домене, добавляя сторонний компонент для выполнения тяжелой работы. Я лично против этого, но если кто-то спросит тебя «где вы гарантируете, что URL действителен? Я не могу найти его в вашем домене» Вы могли бы сделать это (я бы сказал, валидация URL — это не бизнес, а уровни инфраструктуры и приложений)
На самом деле, домен все равно не гарантирует, что URL-адрес действителен, потому что проверка по-прежнему обеспечивается прикладным уровнем (что, если класс Validator всегда возвращал true?), Поэтому я и против этого. Если вам все равно это нужно, по крайней мере, если вы перейдете от симфонии к любому другому виду валидатора, ваш домен останется нетронутым, и ваш домен не будет связан с определенными сторонними библиотеками, и любое приложение может предоставить собственный валидатор (поскольку ваш домен может использоваться различными приложениями, такими как веб, мобильные, настольные, внешние вызовы API и т. д.).
Других решений пока нет …