Načítání modelů a Dependency Injection (doplňte návod)
- Tomáš Votruba
- Moderator | 1114
Doufám, že jsem Majkla nepředběhl, ale tento slibovaný návod je velmi očekávaný :). Tedy čím a jak nahradit modelLoader?
Na základě kladně hodnoceného Moe CMS (1, 2, 3) jsem zkusil návod vytvořit: Načítání modelu s NotORM a Dependency Injection
Sice to jede, ale myslím, že to jde lépe. Např. sjednotit předávané
argumenty, možná nějak využít BaseModel
, ale těžko říct,
nechci zcestně hádat. Prosím o doplnění/opravu návodu (a mých
znalostí).
Děkuji :)
Editoval Schmutzka (10. 4. 2012 2:06)
- Filip Procházka
- Moderator | 4668
Já bych jenom doplnil rýpnutí. Slovo „model“ do názvu modelu nepatří.
- Tomáš Votruba
- Moderator | 1114
Děkuji za těch pár tipů. Přejmenování čehokoliv nechám na vás zkušenějších, nejsem proti.
Tento návod by mohl nahradit rovnou 3 starší přístupy, kde je ModelLoader použit, takže by šlo smazat:
- https://pla.nette.org/…cy-injection
- https://pla.nette.org/…cy-injection
https://pla.nette.org/…cy-injection
Teď bych z toho jako nováček nebyl moc chytrý :(.
Editoval Schmutzka (10. 4. 2012 2:05)
- LuKo
- Člen | 116
Jestli mohu jednu drobnou připomínku. Úplně poslední příklad bych místo
$results = $this->models->balance->fetchAll();
raději použil
$results = $this->models->user->getByName('Jan Novák');
aby se použilo vše, co je v předchozím kódu a zbytečně to
u nováčků nevyvolávalo WTF, kde se tam vzalo nějaké balance
(to by asi zvládl odvodit) a kde se vykouzlilo fetchAll
(přidává framework sám?), když tam nikde v předchozím kódu není. Vím,
profíci si snadno domyslí vše potřebné, ale pro ně asi návod není
určený ;) Jinak díky za návod, docela se mi hodí.
- Vojtěch Dobeš
- Gold Partner | 1316
Vážně díky za vytrvalou práci na dokumentaci :). Mám jen takový
drobný návrh – nebylo by lepší rovnou udělat zkratku na modely pomocí
__get()
, aby se k nim přistupovalo
$this->balance
? Totiž jakmile přijde okamžik, kdy se do
presenterů budou předávat závislosti přímo (nikoliv přes
$context
) snadno, tak bude jednoduší tuhle
metodu __get()
zrušit a přistupovat přímo ke členským
proměnným, a nebude třeba odstraňovat všude v kódu ono
$this->models->
. Což?
- Tomáš Votruba
- Moderator | 1114
potapnik napsal(a):
to je paráda! konečně jsem to pochopil a začal používat pořádně a ne magicky :) díky Schmutzko!
Osobně jsem z té sekularizace trochu nesvůj, ale snad vše funguje. Já díky :)
vojtech.dobes napsal(a):
Vážně díky za vytrvalou práci na dokumentaci :). Mám jen takový drobný návrh – nebylo by lepší rovnou udělat zkratku na modely pomocí
__get()
, aby se k nim přistupovalo$this->balance
? Totiž jakmile přijde okamžik, kdy se do presenterů budou předávat závislosti přímo (nikoliv přes$context
) snadno, tak bude jednoduší tuhle metodu__get()
zrušit a přistupovat přímo ke členským proměnným, a nebude třeba odstraňovat všude v kódu ono$this->models->
. Což?
Díky za díky :).
Vypadá to líně, což se mi líbí, ale vidím tam moc magie:
- výše uvedený zápis bych volal jako
$this->user
(kolize) - nutnost pojmenovat modely jinak než jako všechny proměnné dostupné
přes
$this
- pokud kouknu na kód, dojde mi až po načtení si
models.neon
, že vlastně (a kdy vždy) volám model
Nicméně při dodržení určité jmenné konvence, např. `mUser by to možné bylo. Klidně příklad rozepiš a mohu ho přidat jako alternativní přístup B (pokud nemáš práva). Napadá mne, že by stačilo použít místo:
services:
models: Nette\DI\NestedAccessor(@container, "models")
models.user: Models\User
models.article: Models\Article
toto:
services:
mUser: Models\User
mArticle: Models\Article
Jestli jsem to nepochopil, tak mne oprav, ideálně příkladem.
Editoval Schmutzka (10. 4. 2012 0:53)
- crempa
- Člen | 198
Ahoj, diky za perfektni navod, jen malej dotaz:
jde nejak zaridit abych nemusel vypisovat vsechny modely do configu, tj. pokud
pridam novou tridu dedici od base v danym model namespace tak bude hned
dostupna pod $models→ ?
Nejsem si jistej zda to soucasnej konfigurator umi a nebo je to na vlastni
implementaci nejakeho generatoru toho containeru…
diky
- Majkl578
- Moderator | 1364
Schmutzka napsal(a):
Doufám, že jsem Majkla nepředběhl
Tahle otázka doufám nebyla myšlena vážně. Za slušnost bych považoval kdybys mě alespoň kontaktoval s dotazem, jestli jsem na tom např. už nezačal.
Považuji za nehoráznou drzost ukrást můj text, upravit ho a následně jej vydávat za svůj.
Třešničkou na dortu bylo zneužití URL, kterou jsem před pár dny přidal do původního článku.
Obsahově to stojí za pendrek.
- Neudělal jsi nic jiného, než že jsi slepil pár kusů kódu, kde navíc půlka je pro účel takového návodu nevhodná.
- Naprosto nesmyslně jsi použil NotORM, jehož použití je spíše rarita.
- Vůbec jsi nevysvětlil, co která část znamená. Zrovna to považuji za klíčovou část u něčeho, co má být v kuchařce/Planette.
tento slibovaný návod je velmi očekávaný :)
Nevšiml jsem si, že by ho někdo očekával.
- Tomáš Votruba
- Moderator | 1114
@Majkl578: Omlouvám se, tvé mlčení jsem si chybně vyložil jako souhlas s postupem. Už to tam viselo poměrně dlouho i přes reakce na toto téma na fóru (= očekávání), tak jsem chtěl mezeru doplnit.
Url jsem zpět uvolnil a přehodil na url s NotORM. Omlouvám se za způsobené potíže, nic z toho nebylo mým úmyslem. Původní autorství jsem doplnil, cache vyhodil (díky).
Jestli jsem ještě něco zampomněl odvrtat, tak řekni.
- Filip Procházka
- Moderator | 4668
Já bych to zase tak přísný nebyl, přece jenom publikováním zde na webu souhlasíš s nějakou tou licencí.
Co se mi moc nelíbí, tak opětovné použití service locatoru. Když už píšeme nové návody, bylo by super je psát dopředu-kompatibilně. Tedy plně využít DI.
Abych jenom nerejpal, tak až se pla.nette
trochu uklidní, tak
taky něco přihodím (nejspíš latte makra).
- Tomáš Votruba
- Moderator | 1114
@hosiplan: Teď si nejsem jist, co máš konkrétně z té mé změti na mysli. Rád bych tam žádné staré techniky neměl.
- Majkl578
- Moderator | 1364
Schmutzka napsal(a):
@Majkl578: Omlouvám se, tvé mlčení jsem si chybně vyložil jako souhlas s postupem. Už to tam viselo poměrně dlouho i přes reakce na toto téma na fóru (= očekávání), tak jsem chtěl mezeru doplnit.
Asi máme různou představu o významu spojení dlouhou dobu. Přidal jsem to tam ve čtvrtek večer (viz log) a 4 dny mi opravdu nepřipadají dlouho.
HosipLan napsal(a):
Já bych to zase tak přísný nebyl, přece jenom publikováním zde na webu souhlasíš s nějakou tou licencí.
Ano, s Creative Commons CC-BY-SA (jak je uvedeno v patičce stránek). Pokud bychom byli důslední, tak explicitně vyžaduje uvedení autora a zdroje.
HosipLan napsal(a):
Co se mi moc nelíbí, tak opětovné použití service locatoru. Když už píšeme nové návody, bylo by super je psát dopředu-kompatibilně. Tedy plně využít DI.
Souhlasím. Obsahově je to hodně nešťastné a nepřináší to vpodstatě nic nového a ani poučného. Osobně bych volil jinou koncepci.
- Patrik Votoček
- Člen | 2221
Majkl578 tu reakci trochu přehnal ale o to řešit nechci…
Aktivita je super… Ale tady to je spíš aktivita která může mít špatné důsledky. V první řadě návod není přepsání ModelLoaderu na DIc ale spíše na ServiceLocator. V další řadě název „models“ je blbost.
Jinak co se týká naříkání zda pojmenovávat třídu FooModel nebo ne je přehnané. Naopak za účelem tohoto návodu mě připadá použití takového názvu více než vhodné. Každý hned pochopí „wo co go“ než aby si musel na pomoc přizvat Google a zjišťovat co je to Repository, DAO etc…
- Tomáš Votruba
- Moderator | 1114
@Majkl578: 19 dní pryč a nic. Doufal jsem, že po tvých slovech přijde čin, abych se měl za co stydět. Přesně z tohoto důvodu jsem to sepsal rychlou jehlou dle svých dovedností, abych tě nemusel obtěžovat s něčím, co sám nechceš dělat.
Mohl bych poprosit někoho z obliga, zda by se do toho pustil? Stále jsem se nedověděl, co na mé verzi opravit a jak. Díky.