Autor Zpráva
Boss
Profil *
Ahoj, programuju ORM a potřebuju poradit. celé to mám rozdělené na mappery které pracují s daty, načítají je z db nebo ze souboru. pak mám repository které by se měli starat o to, jaký maper přiřadit a nad tím mám entity. Programuju to v Nette a k entitám se přistupuje přes DI container.
vypadá to zhruba nějak takto:
   class UserService{
       public function __construct(UserRepository)
   }

  class UserRepository{
     public function __construct(IUserMapper)
  }

  class UserMySqlMapper implements IUserMapper{
      public function __construct(\Nette\Database\Context)
   }

   class UserImageMapper implements IUserMapper{
          public function __construct(File)
   }

Problém je v tom, že budu chtít z UserMySqlMapperu získávat info o uživateli z db a přes UserImageMapper načítat jeho galerii ze souboru.
přitom volání v presenteru bude vypadat takto: $this->userService->findUser($id); $this->userService->getUserGallery($idUser)
Potřebuju tedy v repository umět nějak vyměnit Mapper. Napadlo mě mít Mappery vytvořený přímo v repository ale to je nesmysl že? mám je tady oba vkládat konstruktorem? může se stát že například nebudou potřeba oba ale jen jeden a je tedy zbytečné mít instanci navíc, obzvlášt když v jiných případech můžu využívat více mapperů.
Díky za radu
Tori
Profil
Ty mappery vypadají zajímavě, ale mám pocit, že jste spíš myslel entitu. Mapper je AFAIK vrstva, která překládá požadavky od repository (findBy, update, save,...) na konkrétní implementaci úložitště (DB, XML, memcache...). Možná vás postrčí i článek o pěti vrstvách modelu včetně komentářů.

K otázce: Můžete to mít udělané např. tak, že entita User bude obsahovat i proměnnou $images, a kromě usersRepository si do entity injectnete i ImagesRepository. Při prvním šáhnutí na obrázky: $user->images->fetchAll() se uvnitř entity automaticky provede: $this->images = $this->imagesRepository->findBy(["userId" => $this->id]);. Anebo se můžou načíst všechny podobjekty automaticky hned, pokud vyhledáváte jen jednoho uživatele podle ID. Anebo můžete fasádě/službě nějakým způsobem nejdřív říct, které podobjekty budete chtít načíst, a pak teprv zavolat $user = $this->userService->find($id);

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: