Jak sdílet model mezi dvěma a více namespace?
- Robin
- Člen | 5
Ahoj, řešim problém s namespace a nemůžu najít něco co by mi
pomohlo…
Píšu si web s administrací a mám to rozdělené na Front modul a Admin
modul. Používám tedy namespace FrontModule a AdminModule.
Napsal jsem si model Posts, ve kterém mám metodu na výpis článků z databáze. Tomu jsem ale žádný namespace neudělil s doměním, že ho pak budu moct používat v obou namespace (Front pro výpis, Admin pro přidání, editaci, atd.). To jsem si ale naběhl, protože když si teď zavolám třídu Posts z FrontModule, aplikace ji nenajde, protože ji hledá v FrontModule\Post.
S Nette začínám a v těch namespaces mám docela hokej, tak bych byl rád, kdyby mi někdo objasnil jak na to, protože když modelu dám namespace FrontModule, tak front pojede v poho ale z AdminModule se k němu nedostanu, navíc přiřadit mu natvrdo Front nebo Admin mi přijde nepraktický a mít 2× stejnej model pro každej namespace je taky blbost.
Snad sem se v tom moc nezamotal a je to aspoň trochu srozumitelný :) S nette i programováním začínám, tak prosím mějte trpělivost ;)
- Ot@s
- Backer | 476
Jmenné prostory dokážou být oříšek :-) Zkus se inspirovat
u existujících projektů, např. Venne-CMS či KdybyCMS (viz. Nette Addons).
Můžeš si např. třídy rozdělit na 3 hromádky: AdminModule, FrontModule a
Common (nebo třeba MyCMS). Namespace AdminModule používáš výhradně
v adresáři s AdminModule, FrontModule v adresáři FrontModule. Jsou to
tedy věci, které souvisí čistě s funkčností modulu. Co Common si dej
vše, co je společné pro celý projekt (tj. např. model Post, resp.
Common/Model/Post
nebo komponentu Paginator, resp.
Common/Components/Paginator). První level máš vyřešený. Další jsou jen
na Tobě (vždy od obecného ke konkrétnímu).
PS: Na Tvůj probém existuje jednoduché, ale asi né moc košer řešení.
Model Posts bez určení namespace prefixuj zpětným lomítkem,
tj. new \Posts($dbcon)
- Jan Tvrdík
- Nette guru | 2595
@Robin: Pohybuješ se na hraně, za kterou dotazy vyhazuji do koše, zamykám a mažu, protože smyslem tohoto fóra není vysvětlovat lidem základy PHP.
Co se týče tvojí otázky – model by měl být nezávislý na
presenterech, tedy i na jmenných prostorech FrontModule
a
AdminModule
, které existují pouze kvůli nim. Umísti ho tedy
např. do nového jmenného prostoru Model
.
- Robin
- Člen | 5
Díky za odpověď, s tím lomítkem mě to mohlo napadnout :D Určitě se podívám na to rozdělení s Common. Zkoušel jsem dát model do samotného namespace Models. To mi ale bylo k ničemu, protože teď hledal tu třídu ve FrontModule\Models\Posts respektive AdminModule\Models\Posts, takže bych se použití toho lomítka stejně nevyhnul, akorát bych musel psát new \Models\Posts.