Načítání modelů a Dependency Injection (doplňte návod)

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Tomáš Votruba
Moderator | 1114
+
0
-

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)

mkoubik
Člen | 728
+
0
-

Já používám prostě jenom:

services:
	models: Nette\DI\NestedAccessor(@container, 'models')
	models_foo: Models\Foo
	models_bar: Models\Bar

(v models.neon)
Používá se to úplně stejně, člověk se obejde bez extension, akorát je to delší o ten prefix models_ u každé služby.

Filip Procházka
Moderator | 4668
+
0
-

Já bych jenom doplnil rýpnutí. Slovo „model“ do názvu modelu nepatří.

davidm
Člen | 81
+
0
-

souhlas s hosiplan :) od vydani CMS jsem taky dosel k posunu ze to neni zrovna nejstastnejsi reseni :) slovo model je az moc vseobecne. Btw, zrovna v tom priklade z prvniho prispevku by se extension mela jmenovat repositories, popripade entityRepositories

Tomáš Votruba
Moderator | 1114
+
0
-

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:

Teď bych z toho jako nováček nebyl moc chytrý :(.

Editoval Schmutzka (10. 4. 2012 2:05)

LuKo
Člen | 116
+
0
-

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í.

Tomáš Votruba
Moderator | 1114
+
0
-

Sry, opraveno, díky.

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

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ž?

potapnik
Člen | 127
+
0
-

to je paráda! konečně jsem to pochopil a začal používat pořádně a ne magicky :) díky Schmutzko!

Tomáš Votruba
Moderator | 1114
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

@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
+
0
-

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
+
0
-

@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
+
0
-

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
+
0
-

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…

minzo
Člen | 23
+
0
-

Majkl578 & Patrik Votoček: Tak dejte hlavy dohromady a udělejte lepší návod. Konkurence a rivalita nikdy neškodí ;)

Schmutzka: Díky za návod. Pomohlo mi to vysvětlit si další části Nette ;)

Tomáš Votruba
Moderator | 1114
+
0
-

@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.