ORM Doctrine sluzba v entity
- balicekt
- Člen | 52
Zdravim, resim problem ohledne toho jak dostat sluzbu do entity. Muj problem spociva v tom, ze mam Entity Produkt kde je cena pro vice zemi napriklad jedna cena v CZK pro CS a druha cena v EUR pro SK. Pouzivam k tomu https://github.com/…ineBehaviors. Dale mam tabulku s Country kde je ulozena napriklad mena a vyse DPH pro jednotlive zeme (zeme se vybira podle toho o jakou se jedna domenu). Muj dotaz zni jak nejak elegantne dostat Country neboli CountryService do Entity Produkt. Aby kdyz zavolam $product->getPrice() jsem rovnou dostal spravnou cenu pro danou zemi (respektive domenu, ale to resi countryService). Muj dotaz tedy zni jak Entite Produkt podstrcit CountryService neboli Country tak, abych nemusel delat napriklad toto: $product->getPrice($country)
Jedno z reseni, ktere mi napadlo je vytvorit si specialni Filter, ktery toto bude resit. Napriklad v latte neco takoveho {$product->getPrice() | priceFilter} dle meho nazoru to bude fungovat ale neni to uplne idealni reseni.
Za jakykoliv napad budu velice rad. Diky moc!!
- MajklNajt
- Člen | 498
ahoj, neviem, či hľadiska návrhu je kompetenciou entity rozhodovať, ktorú cenu vráti – skôr by som to delegoval na nejaký nazvime si to napr. PriceResolver, ktorý si v konštruktore vyžiada všetky potrebné servisy a tento resolver potom nasetuješ entite niekde vo fasáde (keď si ju vyťahuješ z repozitára)
- balicekt
- Člen | 52
Diky za zpravu. Co presne mas na mysli tim nasetujes? Momentalne mam neco jako:
======================================================
ProductService:
public function getProducts() {
$query = new ProductQuery();
return $this->em->getRepository(Product::class)->fetch($query);
}
======================================================
ProductPresenter:
public function renderProducts(){
$this->template->products =
$this->productService->getProducts();
}
======================================================
Latte sablona:
…
<div n:foreach=„$products as $product“>
<p>{$product->name}</p>
<p>{$product->getPrice()}</p>
</div>
…
?>
kde mas na mysli nasetovat PriceResolver tak abych k nemu mel pristup v objektu $product pri vykreslovani sablony v latte? Moc Dekuji :)
Editoval balicekt (10. 2. 2019 18:38)
- MajklNajt
- Člen | 498
napr. keď ich vyťahuješ z Repository, čiže v ProductService, napr. takto nejako:
/** @var ProductPriceResolver */
var $productPriceResolver;
public function getProducts() {
$query = new ProductQuery();
$products = $this->em->getRepository(Product::class)->fetch($query);
foreach($products as $product) {
$product->setPriceResolver($this->productPriceResolver);
}
return $products;
}
- Gappa
- Nette Blogger | 208
Řešil jsem něco obdobného, nakonec jsem skončil u tohohle řešení, ačkoliv nebude ideální:
Možná by to šlo řešit nějak podobně?
Editoval Gappa (10. 2. 2019 20:50)