Doctrine 2 Entity a Nette Formuláře
- Bilbo
- Člen | 16
Zdravím, chtěl bych se zeptat na Váš názor na toto téma:
Když používám v aplikaci Doctrine 2 jako model a mám pro ni definované entity, které mají v setterech properities validátory a nějak si na základě toho vygeneruji Nette formuláře – považujete za hodně špatný návrh, když se takto budou data vlastně validovat 2× ? Poprvé u Nette formulářů a podruhé, když to budu cpát do těch entit (obzvlášť když to bude např. validace na nějaký složitější reg. výraz)
Moc nevím, jak tento problém nějak šikovně obejít – četl jsem tady na fóru různé thready na toto téma, ale toto konkrétně jsem neobjevil.
Co si o tom myslíte?
Díky za reakce.
- Jan Endel
- Člen | 1016
Nepřipadá mi to jako vyloženě špatný návrh:
- nevíš jestli se ty entity nebudou plnit někdy v budoucnu i jinak, než přes formuláře (třeba import dat z XML)
- na straně formulářů bych validoval vyloženě proto, aby uživatel věděl, jestli údaje vyplnil správně, navíc ho z formulářů elegantněji informovat, že je něco špatně.
- Filip Procházka
- Moderator | 4668
Nejlepší je mít všechny validace v entitě a pravidla pro formuláře z nich generovat. Jak? Třeba takto.
Díky tomu, že validace spustíš automaticky těsně před persistencí,
Doctrine ti nedovolí persistovat nevalidní entitu, protože během persistence
ti vyskočí nějaká ValidationException
.
- Bilbo
- Člen | 16
Jj, tak jsem to myslel, mně šlo jenom o to, jestli není zbytečná
zátěž na výkon, když se to validuje 2×, jednou na formuláři a podruhé
v entitě. Jestli na to není nějaké cool řešení :-)
Příklad (píšu to hodně zjednodušeně, ale snad to půjde pochopit):
// Třída Entity.
class Person {
private $name;
// Budou zde anotace a metody jako tato se budou na základě nich generovat automaticky (pomocí __get(), __set() a __call()
public function setName($name) {
if (!ValidateOnRegexp($name,'[a-zA-Z ]*')) {
throw new Exception(...);
}
}
}
// ----------------
// Něco takového podobného se bude volat automaticky na základě anotací v entitě - $form je instance vlastní formulářové třídy poděděné od klasického Nette UI Formuláře
$form->addText('name', 'Jméno:')->addRule(Form::PATTERN, 'Musí obsahovat pouze písmena a mezery', '[a-zA-Z ]*');
// ----------------
// Po úspěšné validaci se data budou dávat do entity...
if ($form->isSuccess()) {
// ...
$person = new Person();
// ZDE - Validuje se po druhé to samé!!!
$person->setName($valueName);
}
Editoval Bilbo (18. 5. 2012 15:32)
- Filip Procházka
- Moderator | 4668
To je krapet přehnané. Do setterů bych nedával víc než typovou kontrolu.