Autor Zpráva
Sylar
Profil
Zdravím,
píšu vlastní RS a snažím se dodržovat MVC model. Chtěl bych se zeptat jak správně přístupovat z nějaké třídy do jiné. Návrh mám asi takto:
na index.php si zavolám Core.class.php. V Core zjistím, zda-li se má spustit front-end nebo back-end. Zjistím, že Front a zavolám Front.class.php - zde se ji nacházejí metody pro zpracování stránek apod. Mimo jiné, ale ve Front.class.php ale také includují příp. přídavné moduly uživatelů, e-shopu aj. A nyní ten zádrhel. Když ve Front.class.php vytvořím:
$this->shop = new ShopModul($config);
if (isset($_GET['order'])) $this->shop->do_order($_POST);
V metodě do_order() zpracuji objednávku a potřebuji zjistit zda-li je již zadaný e-mail uživatele v databázi -> pokud ne, zaregistruji ho a potřebuji zavolat metodu z třídy Login.class.php, která má ale instanci vytvořenou ve Front.class.php. Problém je v tom, že já se v této chvíli nacházím již "o úroveň níže" (v ShopModul.class.php) a na metody Login.class se nedostanu.

Prosím, jak lze správně tuto situaci vyřešit? Napadá mne jedině v ShopModul.class.php v případě potřeby vytvořit novou instanci Login.class.php, ale to se mi moc nelíbí a připadá mi to zbytečné.
Jan Tvrdík
Profil
$this->shop = new ShopModul($config, $this->loginModul);
Sylar
Profil
Jan Tvrdík:
a to je správně tak, jak by se to mělo dělat z důvodů největší rychlosti a přehlednosti? Pokud bych tedy ve třídě ShopModul potřebovl více jiných tříd, je potřeba si všechny jejich instance předat v konstruktoru?
Kolemjdoucí
Profil *
A co tak si udělat nějaký registr pro objekty ?
Sylar
Profil
Kolemjdoucí:
také mne to napadlo. Udělat si jednu třídu, která by v sobě měla reference na všechny ostatní, ale nakonec mi to přišlo poměrně zbytečné, protože ten regist bych vytvořil, nacpal do něj všechny ostatní třídy a jen za pár řádků bych si je z toho zase vytahoval zpět. Nebo jsi měl na mysli něco jiného?
jan99
Profil *
doporučil bych $config rovnou nacpat do $_SERVER['config'] = $config; Dá se k tomu pak hezky dostat i ze statické funkce aniž bys musel něco někde v budoucnu ve třídách přepisovat..
Kolemjdoucí
Profil *
Sylar:
Myslel jsem to jak píšeš. Pokud se nepletu tak se to tak řeší. Koukal jsem na nějaké tutoriály jak udělat vlastní MVC fw a řešilo se to tam dost pomocí toho registru. Ono třeba i v nette je něco jako registr http://doc.nette.org/cs/configuring/systemcontainer
Majkl578
Profil
jan99:
doporučil bych $config rovnou nacpat do $_SERVER['config'] = $config; Dá se k tomu pak hezky dostat i ze statické funkce aniž bys musel něco někde v budoucnu ve třídách přepisovat..
Tak to rozhodně ne. To s OOP nemá nic společného. Neraď tu prosím lidem nesmysly.
terr
Profil *
pouziva sa na to DI cez konstruktor

$object1 = new Class1();
$object2 = new Class2($object1, new Class3());

alebo cez setter:

$object1 = new Class1();
$object2 = new Class2();
$object2->setNejakyNazov($object1);
$object2->setNejakyInyNazov(new Class3());

tento problem sa zvykne riesit aj pomocou IoC frameworkov, kde si zaregistrujes tiredu spolu s interfacom (alebo abstraktnou triedou) a konstruktoru nastavis typ interfacu a IoC framework vytvori instanciu triedy so vsetkymi zavislostami. Vyhoda je ze si mozes nastavit ci sa ma vytvarat vzdy novy objekt alebo sa ma pouzit vzdy ten isty objekt (singleton) alebo si mozes napisat vlastny lifetime manager.

interface INejakyInterfejs
{
   function Funkcia();
}

class NejakaTrieda implements INejakyInterfejs
{
   function Funkcia()
   {
       return 'nieco';
   }
}

class NejakaTrieda2
{
   function __construct(INejakyInterfejs $zavislost)
   {
      ...
   }
}

$kontainer = new NejakyKontainer();
$kontainer->RegisterType('INejakyInterfejs', 'NejakaTrieda', new ContainerControlledLifetimeManager());
$kontainer->RegisterType('NejakaTrieda2');
$obj = $kontainer->Resolve('NejakaTrieda2'); //vytovri sa novy objekt aj so vsetkymi zavislostami

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: