ORM Doctrine sluzba v entity

balicekt
Člen | 52
+
0
-

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 | 471
+
0
-

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
+
0
-

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 | 471
+
0
-

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;
}
balicekt
Člen | 52
+
0
-

Ok diky za odpoved. Toto me napadlo ale neni to reseni, ktere hledam. Toto je trochu neefektivni. Chtel bych tam PriceResolver podstrcit nejak automaticky jiz pri vytvareni respektive natazeni entity Product z DB.

Gappa
Nette Blogger | 199
+
0
-

Ř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)

balicekt
Člen | 52
+
0
-

Super diky za odpoved. Tohle by mohlo dany probelm vyresit.