@ermolaev_nikita

Как организовать бизнес-логику в laravel?

Пытаюсь придумать организацию кода для следующей структуры. 62b4c8683e686200766463.png

В чем суть. Каждая сущность, изображенная выше, имеет состояние доступности(available), которое определяется набором её параметров, ну например каждая сущность имеет статус активности. И вот пример проблемы, мы хотим получить Услуги только те:
1. Услуга должна быть активна
2. Её тип должен быть активен
3. Место приема для типа услуги должно быть активно
4. Расписание для места должно быть активно
5. Должны быть доступные день сегодня или в будущем.
6. Для расписания должна существовать активная организация, в которую входит авторизированный клиент.
и т.д.

Как видите все проверки дергаются друг за другом и охватывают все сущности, у каждой сущности свои условия.

Как я попытался решить проблему:
Я попробовал через scope описать признаки доступности, а так же описал дополнительную связь, ну к примеру:
class Service {
	public function type(): BelongTo {
		... // описание связи
	}

	public function availableType() {
		return $this->type()->available();
	}

	public function scopeActive($builder) {
		return $builder->whereStatus(true);
	}

	public function scopeAvailable($builder) {
		return $builder
					->has('availableType')
					->active();
	}
}

class Type {

	public function places(): HasMany {
		// описание связи
	}

	public function availablePlaces(): HasMany {
		// описание связи
	}

	public function scopeActive($builder) {
		return $builder->whereStatus(true);
	}

	public function scopeAvailable($builder): BelongTo {
		$builder
			->has('availablePlaces')
			->active();
	}
}

// Чтобы получить список доступных сервисов просто пишем
Service::available()->get();


Конечно тело запроса превращается в ад)) , но задача выполняется. Все бы ничего, но в данном подходе отсутствует гибкость. Мы не можем отключить проверку какого-то этапа, мы всегда проверяем все этапы, или налету добавить какие-то условие, а ещё наша модель уж слишком сильно обрастает логикой и всякими проверками внутри себя.

Но из плюсов, если мы допишем в запросе with и подгрузим нужные связи, а затем напишем некоторый класс Graph, который пробежится по дереву в поиске нужных нам сущностей, то запросив услугу, по цепочке связей мы всегда можем получить и дни, доступные для для записи.

И все таки как лучше организовать код, когда действия охватывает буквально все сущности?
  • Вопрос задан
  • 107 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы