212 похожих чатов

Приветствую. Вот мы определил свой ограниченный контекст. Определили его агрегаты,

сущности и их объекты-значения. Определили интерфейсы их репозиториев. В репах простые методы:
/**
* @throws ProductAlreadyExistException
*/
public function add(Product $product): void;

/**
* @throws ProductDoesNotExistException
*/
public function get(Identity $identity): Product;

/**
* @throws LogicException
*/
public function save(Product $product): void;

/**
* @throws LogicException
*/
public function remove(Product $product): void;
Далее, реализуем эти репозитории, например inMemory:
class InMemoryProductRepository implements ProductRepositoryInterface
{
// реализуем методы ProductRepositoryInterface
}
Или DoctrineRepository:
class DoctrineProductRepository extends ServiceEntityRepository implements ProductRepositoryInterface
{
// реализуем методы ProductRepositoryInterface
}

Для работы с хранилищем через Doctrine для всего этого дела запилили xml mapping наших доменных агрегатов, сущностей и объектов-значений. На удивление - это получилось сделать сведя на нет влияние на доменную логику. Всё взлетело и всё как бы работает. Но! Возникает вопрос, у Doctrine\ORM\EntityRepository есть куча замечательных методов, например:
public function findBy(array $criteria, ?array $orderBy = null, $limit = null, $offset = null)
public function findOneBy(array $criteria, ?array $orderBy = null)
// Замечательный magic call:
public function __call($method, $arguments)
public function matching(Criteria $criteria)

Теперь в приложении мы ведь не можем использовать всю эту прелесть и магию доктрины? Потому что все этим методы не определены нашим доменным интерфейсом. И как быть? Особенно интересует возможность делать find через Criteria. Я в тупике🙇🏻‍♂️

9 ответов

22 просмотра

Не наследовать EntityRepository, а инжектить его внутрь своего

Nikolay-Deriglazov Автор вопроса
Nikolay Underground
Не наследовать EntityRepository, а инжектить его в...

А как ты потом свой репозиторий подсунешь в маппинг сущности? Он же должен быть ServiceEntityRepository

Nikolay Deriglazov
А как ты потом свой репозиторий подсунешь в маппин...

Его не надо подсовывать в сущность, ты через getRepository(Entity::class) уже указал, с какой сущностью репа работает.

Nikolay-Deriglazov Автор вопроса
Nikolay Underground
не совсем понял

И впрямь, сейчас попробовал подставить свой InMemoryRepository который не наследует ServiceEntityRepository - всё заработало. Я почему-то думал, что repository-class в маппинге, всегда должен наследовать ServiceEntityRepository

Vadim
Его не надо подсовывать в сущность, ты через getRe...

А можно по подробнее на этом моменте 🙏🏼

Ержан
А можно по подробнее на этом моменте 🙏🏼

final class DatabaseEmployeeRepository implements EmployeeRepository { /** * @var EntityRepository<Employee> */ private EntityRepository $repo; public function __construct(EntityManagerInterface $em) { $this->repo = $em->getRepository(Employee::class); }

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Ребят в СИ можно реализовать ООП?
Николай
33
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта