Kdyby\Validator – prePersist/preUpdate
- Magnus
- Člen | 65
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:
- jak napojit dané události
- 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
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)