Doctrine 2 Entity a Nette Formuláře

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Bilbo
Člen | 16
+
0
-

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

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

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

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

To je krapet přehnané. Do setterů bych nedával víc než typovou kontrolu.