Kdyby\Validator – prePersist/preUpdate

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

Ahoj,
používám Kdyby\Doctrine a chtěl bych pomocí rozšíření Kdyby\Validator automaticky validovat všechny entity před úpravou v DB (zřejmě události prePersist a preUpdate).
Nicméně nemohu přijít na to, kde a jak začít. Mohl byste mi někdo poradit, jak pořešit konfiguraci a listener? S událostmi v Doctrine nemám zkušenost a co jsem se díval, tak se to řeší v Symfony, kde (mám pocit) je to trochu jinak než v Nette. Kritické jsou pro mě dva body:

  1. jak napojit dané události
  2. jak v listeneru sebrat objekt Symfony validatoru (nebo jak entity zvalidovat nějak automaticky)

Pokud byste mě mohl někdo trochu popostrčit, budu moc rád. Díky!
Taktéž moc děkuju Filipovi za ta rozšíření.

Editoval Magnus (21. 7. 2016 15:41)

enumag
Člen | 2118
+
0
-

Tohle už kdysi napsal @Majkl578. Později jsem to ještě trochu vylepšil o možnost konfigurovat které validation groups se při flushi budou používat.

Najdeš to v mém balíčku Arachne/Doctrine. Mimochodem je tam ještě jeden zádrhel – totiž že Doctrine entita může být načtená jen částečně a při flushi potřebuješ donačíst zbytek sloupců aby validace proběhla. To jsem v Kdyby/Validator a Arachne/Doctrine také vyřešil.

Validace při flushi je defaultně vypnutá, zapneš ji pomocí tohoto optionu v config.neon.

Ten balíček ti také přidá UniqueEntity constraint.

Teď koukám že instalace asi bude vyžadovat ještě balíček symfony/doctrine-bridge.

Dej si pozor abys u relací mezi entitami nepoužíval všude anotaci @Valid. Pak se to kaskádovitě validuje všechno což může docela trvat než se to natahá z databáze a zvaliduje. @Valid používej jen v případech kdy jeden formulář / API akce vytváří najednou více propojených entit – např. formulář objednávky na e-shopu vyrábí entity Order a OrderProduct, takže na Order::$orderProducts bude anotace @Valid. Přímo na produkty už ale nesahá takže na OrderProduct::$product už ta anotace nebude.

Tolik odpověď na tvůj dotaz. Ohledně Doctrine mám ale i další udělátka, např. Arachne/EntityLoader pro použití entit v parametrech presenterů a komponent nebo Arachne/Forms což je integrace symfony/form do Nette (to už je trochu kanón na vrabce takže jen pro velké systémy se složitými formuláři).

Dej vědět kdyby ti to nefungovalo nebo jsi chtěl ještě s něčím poradit. ;-)

Editoval enumag (22. 7. 2016 8:38)