Creating a custom validation constraint in conjunction with Annotations
Today I needed to create a custom validator for Symfony 2, I began by reading and following the instructions in the documentation here.
However at time of writing this documentation is outdated and what is more we use annotations to define validation, and this introduces extra steps.
So here I will try and explain the extra steps I had to take to get this working.
Extra Step 1
You will need to declare a targets method in your Constraint class as follows:
<?php
namespace Ylly\Extension\ArticleBundle\Validator\Constraints;
use Symfony\Component\Validator\Constraint;
class ArticleTitleSlug extends Constraint
{
public $message = 'This title already exists, please use another';
public function validatedBy()
{
return 'article_title_slug';
}
public function targets()
{
return self::PROPERTY_CONSTRAINT;
}
}
Extra Step 2
Because we are using Annotations to declare validation rules it is necessary to define an alias for the namespace where your validation classes can be found.
When you write @validation:NotBlank on an entity you are actually telling Symfony to use the class Symfony\Component\Validator\Constraints\NotBlank, as @validation is actually a namespace alias.
As our validation class is located in Ylly\ArticleBundle\Validator\Constraints we need to declare a new alias pointing to this namespace, we can do this using the Dependency Injection Container
// Ylly/ArticleBundle/DependencyInjection/ArticleExtension.php
public function load(array $configs, ContainerBuilder $container)
{
$namespaces = $container->getParameter('validator.annotations.namespaces');
$namespaces['articleValidation'] = 'Ylly\\Extension\\ArticleBundle\\Validator\Constraints\\';
$container->setParameter('validator.annotations.namespaces', $namespaces);
}
Note that we use the PHP interface for defining the DIC.
Now we can add the validation constraint to our entity
/**
* @articleValidation:ArticleTitleSlug()
* @validation:NotBlank()
*/
protected $title;
And if the class doesnt exist...
The most difficult aspect of working with annotations that I have experienced
it that if the class doesnt exist, e.g. if you have a typo in your declaration, the annotation reader doesnt throw an error. This is because the annotation reader parses all annotations (including JavaDoc) and if there is no class (for example for @param, @var or @return) it just ignores the annotation.
So if your validator is not working, check your namespaces and class definitions!
Comments
Post new comment
Tags
- DropBox
- XMPP
- android
- apache
- archos
- audacious
- awesome
- bash
- bootstrap
- bristol
- diagramming
- doctrine
- doctrine2
- git
- gloucester
- graphs
- gt540
- jack
- javascript
- manchester
- mapdroyd
- markdown
- mongodb
- paris
- php
- profiling
- projectm
- running
- scripting
- sed
- software design
- ssh
- symfony
- symfony2
- thonon-les-bains
- trainer
- travel
- twig
- ubnutu
- vim
- weymouth
- workflow
- xdebug
- xml
- ylly
- yprox
10 Latest Items
-
08
Maytrainer [Velo] paris - compiègne 153.00km / 05:48:32 / 00:02:16mpkm Fois.
-
06
Maytrainer [Velo] Vincennes Hippodrome 1hr 34.34km / 01:00:00 / 00:01:44mpkm Solo effort. Did interfals (sprinting from zebra crossing to hairpin turn).
-
05
Maytrainer [Run] Diderot > Pnt. Alx III > Rue de Charonne 13.96km / 01:08:40 / 00:04:55mpkm Good to run in the rain. Lots of traffic.
-
04
Maytrainer [Velo] Vincennes Hippodrome 1hr 32.20km / 01:00:00 / 00:01:51mpkm Rode apace a peloton, but tried not to get in the draft. Sprinted for a few minutes on every lap.
-
03
Maytrainer [Run] Dumas > P. Auguste > Belleville > Prc. de Villette > Pt. de Lilas > Pt. Vincennces 14.48km / 01:07:00 / 00:04:37mpkm Kept up a reasonably good pace. No problems from calf muscle as was the case yesterday.
-
02
Maytrainer [Run] Dumas > Diderot > Trocadero > Basitlle 14.48km / 01:10:00 / 00:04:49mpkm Experienced pain in the back of my calf and stopped a few times towards the end.
-
01
Maytrainer [Velo] Dumas > Rambouillet 123.31km / 05:06:00 / 00:02:28mpkm Paris Rambouillet. Sunny day. Ate a bakery pizza, tarte au pomme and drank a cola then lay down on a bench in the châte...
-
29
Aprtrainer [Run] 14 - 15 miles 23.34km / 01:50:00 / 00:04:42mpkm Run down the Rue Charonne, down Boulevard Henri IV, round le Ile St-Louis, along the Seine, crossing the Pont d'lén...
-
28
Aprtrainer [Velo] Vincennes Hippodrome 1hr 34.12km / 01:00:00 / 00:01:45mpkm Actually 45 minutes. Rain stopped play. Also boredom. "Sprinted" up the second half of the upside at each circ...
-
27
Aprtrainer [Run] 54 minutes 11.50km / 00:54:00 / 00:04:41mpkm Ran down and around.

Thx a lot!