Skip to content

Commit

Permalink
[DoctrineBridge] Unique mapping setting is optional
Browse files Browse the repository at this point in the history
  • Loading branch information
ksaveras authored and fabpot committed Apr 22, 2019
1 parent 936355e commit fde4dc9
Show file tree
Hide file tree
Showing 6 changed files with 128 additions and 1 deletion.
25 changes: 25 additions & 0 deletions src/Symfony/Bridge/Doctrine/Test/DoctrineTestHelper.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,12 @@

use Doctrine\Common\Annotations\AnnotationReader;
use Doctrine\Common\Cache\ArrayCache;
use Doctrine\Common\Persistence\Mapping\Driver\MappingDriverChain;
use Doctrine\Common\Persistence\Mapping\Driver\SymfonyFileLocator;
use Doctrine\ORM\Configuration;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\Mapping\Driver\AnnotationDriver;
use Doctrine\ORM\Mapping\Driver\XmlDriver;
use PHPUnit\Framework\TestCase;

/**
Expand Down Expand Up @@ -67,6 +70,28 @@ public static function createTestConfiguration()
return $config;
}

/**
* @return Configuration
*/
public static function createTestConfigurationWithXmlLoader()
{
$config = static::createTestConfiguration();

$driverChain = new MappingDriverChain();
$driverChain->addDriver(
new XmlDriver(
new SymfonyFileLocator(
[__DIR__.'/../Tests/Resources/orm' => 'Symfony\\Bridge\\Doctrine\\Tests\\Fixtures'], '.orm.xml'
)
),
'Symfony\\Bridge\\Doctrine\\Tests\\Fixtures'
);

$config->setMetadataDriverImpl($driverChain);

return $config;
}

/**
* This class cannot be instantiated.
*/
Expand Down
47 changes: 47 additions & 0 deletions src/Symfony/Bridge/Doctrine/Tests/Fixtures/BaseUser.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<?php

namespace Symfony\Bridge\Doctrine\Tests\Fixtures;

/**
* Class BaseUser.
*/
class BaseUser
{
/**
* @var int
*/
private $id;

/**
* @var string
*/
private $username;

/**
* BaseUser constructor.
*
* @param int $id
* @param string $username
*/
public function __construct(int $id, string $username)
{
$this->id = $id;
$this->username = $username;
}

/**
* @return int
*/
public function getId()
{
return $this->id;
}

/**
* @return string
*/
public function getUsername()
{
return $this->username;
}
}
11 changes: 11 additions & 0 deletions src/Symfony/Bridge/Doctrine/Tests/Resources/orm/BaseUser.orm.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">

<mapped-superclass name="Symfony\Bridge\Doctrine\Tests\Fixtures\BaseUser">
<field name="username" column="username" type="string" length="120" />
</mapped-superclass>

</doctrine-mapping>
19 changes: 19 additions & 0 deletions src/Symfony/Bridge/Doctrine/Tests/Resources/validator/BaseUser.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?xml version="1.0" ?>
<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
http://symfony.com/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd">

<class name="Symfony\Bridge\Doctrine\Tests\Fixtures\BaseUser">
<property name="username">
<constraint name="NotBlank">
<option name="groups">Registration</option>
</constraint>
<constraint name="Length">
<option name="min">2</option>
<option name="max">120</option>
<option name="groups">Registration</option>
</constraint>
</property>
</class>
</constraint-mapping>
25 changes: 25 additions & 0 deletions src/Symfony/Bridge/Doctrine/Tests/Validator/DoctrineLoaderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

use PHPUnit\Framework\TestCase;
use Symfony\Bridge\Doctrine\Test\DoctrineTestHelper;
use Symfony\Bridge\Doctrine\Tests\Fixtures\BaseUser;
use Symfony\Bridge\Doctrine\Tests\Fixtures\DoctrineLoaderEntity;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Bridge\Doctrine\Validator\DoctrineLoader;
Expand Down Expand Up @@ -72,6 +73,30 @@ public function testLoadClassMetadata()
$this->assertSame(1, $alreadyMappedMaxLengthConstraints[0]->min);
}

public function testFieldMappingsConfiguration()
{
if (!method_exists(ValidatorBuilder::class, 'addLoader')) {
$this->markTestSkipped('Auto-mapping requires symfony/validation 4.2+');
}

$validator = Validation::createValidatorBuilder()
->enableAnnotationMapping()
->addXmlMappings([__DIR__.'/../Resources/validator/BaseUser.xml'])
->addLoader(
new DoctrineLoader(
DoctrineTestHelper::createTestEntityManager(
DoctrineTestHelper::createTestConfigurationWithXmlLoader()
), '{}'
)
)
->getValidator();

$classMetadata = $validator->getMetadataFor(new BaseUser(1, 'DemoUser'));

$constraints = $classMetadata->getConstraints();
$this->assertCount(0, $constraints);
}

/**
* @dataProvider regexpProvider
*/
Expand Down
2 changes: 1 addition & 1 deletion src/Symfony/Bridge/Doctrine/Validator/DoctrineLoader.php
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ public function loadClassMetadata(ClassMetadata $metadata): bool

// Type and nullable aren't handled here, use the PropertyInfo Loader instead.
foreach ($doctrineMetadata->fieldMappings as $mapping) {
if (true === $mapping['unique'] && !isset($existingUniqueFields[$mapping['fieldName']])) {
if (true === ($mapping['unique'] ?? false) && !isset($existingUniqueFields[$mapping['fieldName']])) {
$metadata->addConstraint(new UniqueEntity(['fields' => $mapping['fieldName']]));
}

Expand Down

0 comments on commit fde4dc9

Please sign in to comment.