In Symfony heb je 2 manieren om te valideren, bijvoorbeeld voor een gebruikersnaam.
Door middel van @Assert in Entity of in Controller zelf, maar wanneer en of hoe weet ik wanneer het juiste manier is van valideren in Entity of controller zelf? Kan iemand dit in het goed Nederlands uitleggen en zonder bundles svp? Alvast bedankt iig!
Als je in je Entity de @assert annotation gebruikt dan wordt er nog helemaal niets gevalideerd. Het is slechts 'een instelling' voor de validator. De validator zal dus nog aangeroepen moeten worden alvorens er daadwerkelijk iets gevalideerd wordt. Waar je die validator aanroept is aan jou en heeft alles met logica te maken. Wanneer je Symfony's formbuilder gebruikt (zoals ik die noem) dan gebruik je indirect de validator-service. Je kent deze wel:
<?php
if ($form->isValid()) {
// ...
}
?>
Ergens in de achtergrond bij het aanroepen van de isValid Method wordt ook gewoon de validator aan het werk gezet.
Vanuit je controller (of een andere class) kun je dit ook handmatig doen:
<?php
$validator = $this->get('validator');
$errors = $validator->validate($entity);
?>
Verder wordt in de methods van een entity volgens mij nauwelijks gevalideerd omdat een entity een data storage is en omdat het niet de bedoeling is dat de setters van de Entity iets anders terug gaan geven als het Object zelf ( return $this; )
[size=xsmall]Toevoeging op 11/09/2015 00:45:20:[/size]
Wat je wel kunt doen in een entity is je data 'Formatten'. Een klassiek voorbeeld is bijvoorbeeld het e-mailadres omzetten naar uitsluitend kleine letters.
<?php
public function setEmail($email)
{
$this->email = strtolower($email);
return $this;
}
Bedankt voor je antwoord en heldere uitleg! Ik kende het inderdaad al van $form->isValid() en wist dat het daarmee pas inging. Nu is het wat meer duidelijk voor mij, ahoewel ik nog een vraagje hebt. Je zegt:
Verder wordt in de methods van een entity volgens mij nauwelijks gevalideerd omdat een entity een data storage is en omdat het niet de bedoeling is dat de setters van de Entity iets anders terug gaan geven als het Object zelf ( return $this; )
Maar hoe zit het dan met dit bijvoorbeeld:
<?php
public static function loadValidatorMetadata(ClassMetadata $metadata)
{
// ...
}
?>
Op de website van Symfony zelf staat er dat je hiermee valideert in Entity zelf of is dat niet correct?
In Symfony hoef je niet per se annotations te gebruiken. Je kunt je validatie-regels (constraints) ook in YAML wegschrijven bijvoorbeeld. Als je annotations gebruikt dan mag je de loadValidatorMetadata method vergeten omdat je constraints automatisch geladen worden.
Ok, Bedankt voor de uitleg! Ik ben bekend met YAML, maar ik vind php/Annotations toch wat prettiger. Het zal vast wel er ooit van komen in de toekomst.
Ik gebruik annotations voor de routing, doctrine en asserts. Alleen voor services en de configuratie gebruik ik yaml. Xml hekelt mij persoonlijk het meest.
Validatie kan op wel meer manieren, oneindig om precies te zijn. Zelf gebruik ik twee vormen van validatie.
Je kunt bijvoorbeeld in de Entity valideren met behulp van Annotations om ervoor te zorgen dat een Form met entity data de validatie automatisch doorloopt wanneer je handleRequest aanroept. Dat is heel handig om ervoor te zorgen dat de data die je in je Entity stopt ook het formaat heeft wat je wilt opslaan in de database.
Een andere manier is om de validatie in de Form Type zelf te doen (het AbstractType dingetje). Je kunt namelijk aan velden een optie 'constraints' toevoegen met een array van alle validatie constraints. Dit is handig voor formulieren waar standaard geen data aan gekoppeld is, bijvoorbeeld een contactformulier.
Verder kun je validatie constraints ook gewoon in components enzo gebruiken, maar in dat geval heb je er waarschijnlijk een ander doel mee.