Začátečnický dotaz – propojení s modelem
- Proloo
- Člen | 24
Zdravím, začal jsem s Nette, dřív jsem pracoval v CakePHP, ale
z různých důvodu mi uplně nevyhovoval (neexistující rozumná práce
s obrázky).
Nette se mi líbí, ale mám v tom zatím docela zmatek a například tuhle
uplnou základní věc jsem nikde v dokumentaci nenašel.
Potřebuju před registrací ověřit jestli už uživatelské jméno a email
neexistují. Chci jít cestou modelů pro každou tabulku.
Bohužel nevím a nikde jsem to nanašel, jak mám v Presenteru použít funkci
z Modelu.
Nette používám „2.0.3 stabilní, uvolněný 4. 4. 2012“
Díky za případnou radu :)
V modelu (Users.php) mám tohle
public function isunique($email, $username)
{
$email = $this->users->where('email', $email)->fetch();
$username = $this->users->where('username', $username)->fetch();
return array('email'=>$email, 'username'=>$username);
}
- mkoubik
- Člen | 728
Nejlíp si ho injektni do presenteru:
private $model;
public function injectFinal(User $model)
{
$this->model = $model;
}
a kdekoliv v presenteru můžeš použít
$this->model->isunique()
.
EDIT: Tohle funguje jen v dev verzi. Ve 2.0 si na model sáhni přes
$this->context->userModel
. Jo a musíš ho mít
zaregistrovanej jako službu v config.neon
. https://doc.nette.org/cs/configuring
Editoval mkoubik (3. 6. 2012 16:20)
- Proloo
- Člen | 24
Bohužel z toho teda moc moudrej nejsem.
Jak si mám v configu zaregistrovat model „Users.php“ jako službu?
Tak abych mohl poté v presenteru použít funkci z tohoto modelu
(viz, výše)?
Prošel jsem si i quickstart a tam je způsob pomocí „továren“, kterej mi ovšem taky nefunuguje a hlavně jsou tam ty továrny napsány jiným způsobem než v tom článku Konfigurace prostředí
- Vojtěch Dobeš
- Gold Partner | 1316
config.neon
:
common:
services:
users:
class: Users # případně Users( abc, def, @jinaSluzba, %necoZeSekceParameters%) apod.
Presenter:
$this->context->users;
- Proloo
- Člen | 24
Ok, díky, tohle funguje, ale zjistil jsem, že pokud to je jako služba, tak
by to mohlo dělat problémy při více dotazech (zde).
A že je asi lepší to mít ve factories.
V quickstartu je to tam napsáno takto:
common:
factories:
users: Users
A poté se funkce modelu v presenteru volá tímto způsobem:
$this->context->createUsers->isexist($form->values->email, $form->values->username);
To mi ale laděnka píše „Service ‚createUsers‘ not found.“
- Vojtěch Dobeš
- Gold Partner | 1316
Je to prosté: jsou služby a jsou továrničky.
Služba je jen jedna (jedna instance). Pokaždé, když si ji vyžádáš, dostaneš tu samou instanci. Vyžádat si ji můžeš pomocí:
$this->context->nazevSluzby
$this->context->getService('nazevSluzby')
Továrničky jsou metody, které něco vytvářejí. Když je zavoláš, vždycky vytvoří novou instanci. Způsob zavolání je jen jeden:
1. $this->context->createNazevTovarnicky()
A to proto, že se ta metoda tak prostě jmenuje :). To, že začíná tím
create
, je konvence.
Takže když máš v kódu $this->context->createUsers
(bez těch uvozovek na konci, které značí volání funkce), tak ti framework
hledá co? Službu createUsers
. A tu tam
samozřejmě nemáš.
- Proloo
- Člen | 24
Dobrá, díky. Ale stejně pořád nevím řešení. Jak to teda má být, abych mohl v presenteru použít funkci z modelu pomocí továrničky? Pročetl jsem celej quickstart, články v dokumentaci o databázích a modelech a stále nevím. Mám to teď vlastně uplně stejně jako v quickstartu a stejně to nefunguje.
Tohle v presenteru:
$this->context->createUsers->isexist()
a tohle v configu
common:
factories:
users: Users
Způsobuje chybu Service ‚createUsers‘ not found., jak to tedy má bejt správně? Potom už si poradím, ale tohle mi prostě není jasný a nikde to není jedndouše vysvětlený dle logické otázky výše „Jak to teda má být, abych mohl v presenteru použít funkci z modelu pomocí továrničky?“
Názorná a funkční ukázka by v dokumentaci byla opravdu za tisíc slov, to mi na Nette jako jediná věc vadí. To že hodně věcí není dostatečně vysvětleno a začátečníkům to opravdu dělá problémy, nerozdíl od jiných frameworků.
Editoval Proloo (4. 6. 2012 18:30)
- Vojtěch Dobeš
- Gold Partner | 1316
Uá… mrkni na ten svůj kód :) Pořád sháníš službu. Službu
createUsers
– proto ti Nette jasně odpovídá „takovou
službu neznám“. Pokud ale napíšeš:
$this->context->createUsers()->isexist()
… nebude v tom žádná magie, ale zavolá se ti ta továrnička. Brzdi s prohlášeními, že to není nikde jednoduše vysvětlený… vysvětlený je to v dokumentaci zcela dostatečně.