Autor | Zpráva | ||
---|---|---|---|
Sylar Profil |
#1 · Zasláno: 22. 2. 2013, 11:54:23
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); 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 |
#2 · Zasláno: 22. 2. 2013, 11:56:32
$this->shop = new ShopModul($config, $this->loginModul); |
||
Sylar Profil |
#3 · Zasláno: 22. 2. 2013, 12:08:26
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 * |
#4 · Zasláno: 22. 2. 2013, 16:26:50
A co tak si udělat nějaký registr pro objekty ?
|
||
Sylar Profil |
#5 · Zasláno: 22. 2. 2013, 20:58:02
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 * |
#6 · Zasláno: 22. 2. 2013, 23:11:14
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 * |
#7 · Zasláno: 23. 2. 2013, 11:22:52
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 * |
#9 · Zasláno: 23. 2. 2013, 22:29:58
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 |
||
Časová prodleva: 11 let
|
0