Я использую CQRS / Event Sourcing для проекта, и он в основном предназначен для изучения и открытия новых вещей.
И я немного запутался с агрегированными корневыми идентификаторами. Не о том, как они работают, а о том, как правильно их написать. Итак, позвольте мне объяснить:
Для каждого агрегатного корня у меня есть идентификатор, и этот идентификатор генерируется библиотекой ramsey / uuid . Я создал пользовательский объект Value с именем Uuid , который охватывает всю логику UUID. Вот некоторый код об этом:
use Ramsey\Uuid\Uuid as BaseUuid;
/**
* @var StringValueObject
*/
private $value;
/**
* Uuid constructor.
*
* @param null|string $value
*
* @throws Exception
*/
protected function __construct(?string $value = null)
{
$uuid_str = BaseUuid::uuid4();
if (null !== $value) {
$pattern = '/' . BaseUuid::VALID_PATTERN . '/';
if (!\preg_match($pattern, $value)) {
throw new InvalidNativeArgumentException($value, array('Uuid string'));
}
$uuid_str = $value;
}
$this->value = StringValueObject::fromNative(\strval($uuid_str));
}
Моя задача сейчас, когда я создаю агрегированный корень, мне нужно, естественно, выбрать тип моего идентификатора, 2 варианта:
- Тип Uuid (объект значения выше)
- Новый объект значения (UserId, PropertyId и т. Д.), Который наследует объект значения Uuid.
На данный момент я используюпервое решение, но я думаю, что второе лучше в основном для Ubiquitous Language, UserID, PropertyId более значим, чем просто Uuid.
Кроме того, когда пользователь запрашивает ресурсы, полезно выставить uuid вURL, есть ли другой способ сделать это? Должен ли я создать другое поле в моем совокупном корне, своего рода идентификатор, который мы можем предоставить в URL для доступа к данному ресурсу?
Спасибо