Správné propojení 2 modelů – circular reference

vokidas
Člen | 2
+
0
-

Ahoj,
již delší dobu řeším, jak správně propojit modely, které na sebe navzájem navazují.

Příklad:

<?php
class productModel(){
  public function removeAllProductsInCategory($category_id){
      // odstraneni vsech produktu v kategorii..
  }

  public function addNewProduct($user_id, $category_id, ...){
      // overeni jestli uzivatel je vlastnikem kategorie
      if($this->categoryModel->ownByUser($category_id, $user_id)){
        // JE POTREBA VYUZIT METODY Z CATEGORYMODELU
      }
  }
}
?>
<?php
class categoryModel(){
  public function removeCategory($category_id){
    $this->productModel->removeAllProductsInCategory($category_id);
    // odstraneni samotne kategorie...
    // JE POTREBA VYUZIT METODY Z PRODUCTMODELU
  }

  public function ownByUser($category_id, $user_id){
    // overeni jestli je uzivatel vlastnikem kategorie
  }
}

?>

Je nějakým způsobem možné propojit takto productModel, který by využil metody v categoryModelu, a zároveň i naopak? Pomocí DI to nepůjde, protože by to vedlo k circular reference.

Cílem je, aby produkt znal kategorii, ve které se nachází, a zároveň aby kategorie věděla, které všechny produkty obsahuje.

Předem děkuji za všechny nápady, jak situaci vyřešit.

Editoval vokidas (13. 3. 2018 11:31)

CZechBoY
Člen | 3608
+
+1
-

Asi bych to rozdělil na více jednoduchých tříd a ty společné části dal do fasády.
např. ProductCategoryRemoveFacade (CategoryRemove, ProductRemove), což bude obsahovat metody removeCategory a removeProduct, v zásadě ty metody budou dělat to stejný, jen bude jinej vstup

suwer
Člen | 33
+
0
-

Pokud ti vznika „circular reference“, na 99 % je chyba uz v navrhu. Dukladneji se zamysli nad zodpovednosti jednotlivych trid a dodrzuj SRP princip.

Z toho ti pak vzniknou tridy (repository, services, …) s jednou konkretni zodpovednosti a jak ti spravne radi CZechBoY, ty nakonec (podle use case) spojis ve fasade.