Cover of the book Symfony 5: The Fast Track

Symfony 5: The Fast Track is the best book to learn modern Symfony development, from zero to production. +300 pages showcasing Symfony with Docker, APIs, queues & async tasks, Webpack, SPAs, etc.

New in Symfony 4.3: Unique constraint

Warning: This post is about an unsupported Symfony version. Some of this information may be out of date. Read the most recent Symfony Docs.

Contributed by
Yevgeniy Zholkevskiy
in #26555.

In Symfony 4.3, the Validator component added a new constraint called Unique to validate that the elements of a collection are unique (none of them is present more than once):

  • Annotations
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    // src/Entity/Person.php
    namespace App\Entity;
    
    use Symfony\Component\Validator\Constraints as Assert;
    
    class Person
    {
        /**
         * @Assert\Unique(message="The {{ value }} email is repeated.")
         */
        protected $contactEmails;
    }
    
  • YAML
    1
    2
    3
    4
    5
    6
    # config/validator/validation.yaml
    App\Entity\Person:
        properties:
            contactEmails:
                - Unique:
                      message: 'The {{ value }} email is repeated.'
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    <!-- config/validator/validation.xml -->
    <?xml version="1.0" encoding="UTF-8" ?>
    <constraint-mapping xmlns="http://symfony.com/schema/dic/constraint-mapping"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/dic/constraint-mapping https://symfony.com/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd">
    
        <class name="App\Entity\Person">
            <property name="contactEmails">
                <constraint name="Unique">
                    <option name="message">The {{ value }} email is repeated.</option>
                </constraint>
            </property>
        </class>
    </constraint-mapping>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    // src/Entity/Person.php
    namespace App\Entity;
    
    use Symfony\Component\Validator\Mapping\ClassMetadata;
    use Symfony\Component\Validator\Constraints as Assert;
    
    class Person
    {
        public static function loadValidatorMetadata(ClassMetadata $metadata)
        {
            $metadata->addPropertyConstraint('contactEmails', new Assert\Unique([
                'message' => 'The {{ value }} email is repeated.',
            ]));
        }
    }
    

The new constraint can be applied to any property of type array or \Traversable and the comparison is strict, so different types are considered different elements (e.g. '7' (string) is different than 7 (integer)).

Symfony already provides some validators related to collections and uniqueness, so keep in mind that:

  • Collection: applies different validation constraints for each collection element.
  • Unique: validates that all the elements of a collection are unique.
  • UniqueEntity: validates that the given property value is unique among all entities of the same type (e.g. the registration email is unique for all the application users).
Help the Symfony project!

As with any Open-Source project, contributing code or documentation is the most common way to help, but we also have a wide range of sponsoring opportunities.

Comments

Very useful, thanks.
Important Constraint
Thank You

Comments are closed.

To ensure that comments stay relevant, they are closed for old posts.