Внутри монолита приложение так же прекрасно разбивается на модули/контексты, как и в микросервисах.Теперь понял, что монолит пока что не плохо. Согласен с этим. Буду просто разбивать по папкам.
src/User
src/Event
Либо так:Event // Модуль-сервис мероприятий
Entity сущности
Disciplines //Дисциплины
Events // мероприятия
Event
Registrations //регистрации
Competition//на соревнования
Battle//на батлы
Geo /гео
Organizations /организации
Persons /персоны
Сквозной функционал между сервисами это плохо т.к. плодит зависимости и влечёт каскадные изменения после каждой правки. Делаете сервисы так чтобы им не было важно, Teacher там, Member или Artist.
p.s. Хотите использовать что-то крутое и сделать ваш проект лучше и качественнее - пишите unit-тесты.
Dicsipline
- id
- name
Event
- id
- name
EventDisipline
- id --> discipline_id
- event --> event_id
Registration
id
discipline_id --> event_disipline_id
Dicsipline
- id
- name
Event
- id
- name
EventDisipline
- id
- discipline_id --> discipline_id
- event --> event_id
Registration
id
discipline_id --> event_disipline_dicipline_id
competition //таблица соревнований
competition_settings // таблица настроек
- competition_id
- reg_start
- reg_end
.... etc
competition //таблица соревнований
competition_settings// таблица настроек
-id
- name
- default
competition_setting_assignments // таблица настроек соревнований
- competition_id
- setting_id
competition //таблица соревнований
- id
- settings (json)
Тут вопрос в том, будет ли логика в классе, например, Discipline, или инфа по сути справочная, т.к. на текущий момент информация там выглядит не очень связно.А что именно там не так?
Ну, во первых - почему константы торчат наружу(public)?
А во вторых, что такое Event Discipline из вашего кода ну никак не ясно, как не ясно....
.. почему эту инфу не поместить в агрегат Discipline
$this->expectExceptionMessage('Price already exists.');
$discipline->addPrice(
$priceId = PriceId::next(),
$date = new Date($currentDate, $currentDate->modify('+1 day')),
$price = 120,
$currency = 'RUB',
$calculator = Price::CALCULATOR_TYPE_REGISTRATION
);
public function addPrice(PriceId $id, Date $date, int $value, string $currency, string $calculator): void
{
foreach ($this->prices as $current) {
if ($current->getDate()->getStart() >= $date->getStart() && $date->getStart() <= $current->getDate()->getEnd()) {
throw new \DomainException('Price already exists.');
}
if ($current->getDate()->getStart() >= $date->getEnd() && $date->getEnd() <= $current->getDate()->getEnd()) {
throw new \DomainException('Price already exists.');
}
}
$this->prices->add(new Price($this, $id, $date, $value, $currency, $calculator));
}
public function testExists(): void
{
$currentDate = new \DateTimeImmutable('+1 day');
$event = (new EventBuilder())->activate()->build();
$discipline = (new DisciplineBuilder())->build();
$discipline = Discipline::create($event, new Id($discipline->getId()->getValue()));
$discipline->addPrice(
$priceId = PriceId::next(),
$date = new Date($currentDate->modify('+4 day'), $currentDate->modify('+5 day')),
$price = 100,
$currency = 'RUB',
$calculator = Price::CALCULATOR_TYPE_PERSON
);
$this->expectExceptionMessage('Price already exists.');
$discipline->addPrice(
$priceId = PriceId::next(),
$date = new Date($currentDate, $currentDate->modify('+1 day')),
$price = 120,
$currency = 'RUB',
$calculator = Price::CALCULATOR_TYPE_REGISTRATION
);
}