@tukreb

Как оптимизировать сложные проверки в Entity?

Есть Entity с методом add()
В этом методе, есть сложная проверка, которая через Doctrine тянет объекты из разных Entity. На чистом SQL разумеется можно сделать более быстрые запросы, но в Entity этого делать нельзя.
Если вынести это в service, то тогда метод add() в Entity остаётся без проверок, и кто-то или я может случайно вызывать его в обход service.
Как поступают в таких ситуациях? Инжектят через приватных конструктор в Enity требуемые сервисы и потом в нужном методе вызывают? Или пишут статические сервис методы? Но если верить этому https://stackoverflow.com/questions/10330704/symfo... то так делать нельзя

В общем какой здесь best practice?
  • Вопрос задан
  • 282 просмотра
Решения вопроса 1
@dzhebrak
Как вариант, можно вынести только проверку в отдельный сервис в доменном слое (Domain Layer), и этот сервис передавать как аргумент в метод add() вашей сущности. Если этот сервис бросит исключение, то метод add прекращает выполнение. В сервис передавать в конструкторе репозиторий или другой объект, который подгрузит необходимые для проверки данные.

Далее вынести вызов метода add() в сервис на уровне приложения (Application Layer), как вы написали, в котором и передавать ранее созданный сервис проверки в метод add().

В такой реализации вам всегда будет необходим этот доменный сервис, и вызвать метод add() без него не получится.

Пример:
class Entity
{
	public function add(ComplexEntityValidator $validator) {
		$validator->validate();
	}
}

class ComplexEntityValidator
{
	public function __construct(EntityRepository $repository) {

	}

	public function validate() {
		// проверка
	}
}

class EntityApplicationService
{
	public function __construct(ComplexEntityValidator $validator) {

	}

	public function __invoke() {
		$entity = new Entity();
		$entity->add($validator);
		// сохранение сущности
	}
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
19 апр. 2024, в 05:01
999999 руб./за проект
19 апр. 2024, в 03:52
1000 руб./за проект
19 апр. 2024, в 03:01
1000 руб./за проект