Skip to content

Commit 7e56ef1

Browse files
committed
bug #31085 [DoctrineBridge] Unique mapping setting is optional (ksaveras)
This PR was squashed before being merged into the 4.3-dev branch (closes #31085). Discussion ---------- [DoctrineBridge] Unique mapping setting is optional | Q | A | ------------- | --- | Branch? | master | Bug fix? | yes | New feature? | no | BC breaks? | no | Deprecations? | no | Tests pass? | yes | Fixed tickets | | License | MIT | Doc PR | ```sh Executed script cache:clear [KO] [KO] Script cache:clear returned with error code 1 !! !! // Clearing the cache for the dev environment with debug !! // true !! !! In DoctrineLoader.php line 71: [ErrorException] Notice: Undefined index: unique Exception trace: () at /home/ksaveras/Projects/mokytojas.local/vendor/symfony/doctrine-bridge/Validator/DoctrineLoader.php:71 Symfony\Bridge\Doctrine\Validator\DoctrineLoader->loadClassMetadata() at /home/ksaveras/Projects/mokytojas.local/vendor/symfony/validator/Mapping/Loader/LoaderChain.php:54 Symfony\Component\Validator\Mapping\Loader\LoaderChain->loadClassMetadata() at /home/ksaveras/Projects/mokytojas.local/vendor/symfony/validator/Mapping/Factory/LazyLoadingMetadataFactory.php:105 Symfony\Component\Validator\Mapping\Factory\LazyLoadingMetadataFactory->getMetadataFor() at /home/ksaveras/Projects/mokytojas.local/vendor/symfony/framework-bundle/CacheWarmer/ValidatorCacheWarmer.php:63 Symfony\Bundle\FrameworkBundle\CacheWarmer\ValidatorCacheWarmer->doWarmUp() at /home/ksaveras/Projects/mokytojas.local/vendor/symfony/framework-bundle/CacheWarmer/AbstractPhpFileCacheWarmer.php:51 Symfony\Bundle\FrameworkBundle\CacheWarmer\AbstractPhpFileCacheWarmer->warmUp() at /home/ksaveras/Projects/mokytojas.local/vendor/symfony/http-kernel/CacheWarmer/CacheWarmerAggregate.php:96 Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerAggregate->warmUp() at /home/ksaveras/Projects/mokytojas.local/vendor/symfony/framework-bundle/Command/CacheClearCommand.php:194 Symfony\Bundle\FrameworkBundle\Command\CacheClearCommand->warmup() at /home/ksaveras/Projects/mokytojas.local/vendor/symfony/framework-bundle/Command/CacheClearCommand.php:129 Symfony\Bundle\FrameworkBundle\Command\CacheClearCommand->execute() at /home/ksaveras/Projects/mokytojas.local/vendor/symfony/console/Command/Command.php:255 Symfony\Component\Console\Command\Command->run() at /home/ksaveras/Projects/mokytojas.local/vendor/symfony/console/Application.php:930 Symfony\Component\Console\Application->doRunCommand() at /home/ksaveras/Projects/mokytojas.local/vendor/symfony/framework-bundle/Console/Application.php:87 Symfony\Bundle\FrameworkBundle\Console\Application->doRunCommand() at /home/ksaveras/Projects/mokytojas.local/vendor/symfony/console/Application.php:273 Symfony\Component\Console\Application->doRun() at /home/ksaveras/Projects/mokytojas.local/vendor/symfony/framework-bundle/Console/Application.php:73 Symfony\Bundle\FrameworkBundle\Console\Application->doRun() at /home/ksaveras/Projects/mokytojas.local/vendor/symfony/console/Application.php:149 Symfony\Component\Console\Application->run() at /home/ksaveras/Projects/mokytojas.local/bin/console:40 cache:clear [--no-warmup] [--no-optional-warmers] [-h|--help] [-q|--quiet] [-v|vv|vvv|--verbose] [-V|--version] [--ansi] [--no-ansi] [-n|--no-interaction] [-e|--env ENV] [--no-debug] [--] <command> ./bin/console ca:cl ``` Commits ------- fde4dc9 [DoctrineBridge] Unique mapping setting is optional
2 parents eab7611 + fde4dc9 commit 7e56ef1

File tree

6 files changed

+128
-1
lines changed

6 files changed

+128
-1
lines changed

src/Symfony/Bridge/Doctrine/Test/DoctrineTestHelper.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,12 @@
1313

1414
use Doctrine\Common\Annotations\AnnotationReader;
1515
use Doctrine\Common\Cache\ArrayCache;
16+
use Doctrine\Common\Persistence\Mapping\Driver\MappingDriverChain;
17+
use Doctrine\Common\Persistence\Mapping\Driver\SymfonyFileLocator;
1618
use Doctrine\ORM\Configuration;
1719
use Doctrine\ORM\EntityManager;
1820
use Doctrine\ORM\Mapping\Driver\AnnotationDriver;
21+
use Doctrine\ORM\Mapping\Driver\XmlDriver;
1922
use PHPUnit\Framework\TestCase;
2023

2124
/**
@@ -67,6 +70,28 @@ public static function createTestConfiguration()
6770
return $config;
6871
}
6972

73+
/**
74+
* @return Configuration
75+
*/
76+
public static function createTestConfigurationWithXmlLoader()
77+
{
78+
$config = static::createTestConfiguration();
79+
80+
$driverChain = new MappingDriverChain();
81+
$driverChain->addDriver(
82+
new XmlDriver(
83+
new SymfonyFileLocator(
84+
[__DIR__.'/../Tests/Resources/orm' => 'Symfony\\Bridge\\Doctrine\\Tests\\Fixtures'], '.orm.xml'
85+
)
86+
),
87+
'Symfony\\Bridge\\Doctrine\\Tests\\Fixtures'
88+
);
89+
90+
$config->setMetadataDriverImpl($driverChain);
91+
92+
return $config;
93+
}
94+
7095
/**
7196
* This class cannot be instantiated.
7297
*/
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<?php
2+
3+
namespace Symfony\Bridge\Doctrine\Tests\Fixtures;
4+
5+
/**
6+
* Class BaseUser.
7+
*/
8+
class BaseUser
9+
{
10+
/**
11+
* @var int
12+
*/
13+
private $id;
14+
15+
/**
16+
* @var string
17+
*/
18+
private $username;
19+
20+
/**
21+
* BaseUser constructor.
22+
*
23+
* @param int $id
24+
* @param string $username
25+
*/
26+
public function __construct(int $id, string $username)
27+
{
28+
$this->id = $id;
29+
$this->username = $username;
30+
}
31+
32+
/**
33+
* @return int
34+
*/
35+
public function getId()
36+
{
37+
return $this->id;
38+
}
39+
40+
/**
41+
* @return string
42+
*/
43+
public function getUsername()
44+
{
45+
return $this->username;
46+
}
47+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
5+
http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
6+
7+
<mapped-superclass name="Symfony\Bridge\Doctrine\Tests\Fixtures\BaseUser">
8+
<field name="username" column="username" type="string" length="120" />
9+
</mapped-superclass>
10+
11+
</doctrine-mapping>
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?xml version="1.0" ?>
2+
<constraint-mapping xmlns="http://symfony.com/schema/dic/constraint-mapping"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://symfony.com/schema/dic/constraint-mapping
5+
http://symfony.com/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd">
6+
7+
<class name="Symfony\Bridge\Doctrine\Tests\Fixtures\BaseUser">
8+
<property name="username">
9+
<constraint name="NotBlank">
10+
<option name="groups">Registration</option>
11+
</constraint>
12+
<constraint name="Length">
13+
<option name="min">2</option>
14+
<option name="max">120</option>
15+
<option name="groups">Registration</option>
16+
</constraint>
17+
</property>
18+
</class>
19+
</constraint-mapping>

src/Symfony/Bridge/Doctrine/Tests/Validator/DoctrineLoaderTest.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
use PHPUnit\Framework\TestCase;
1515
use Symfony\Bridge\Doctrine\Test\DoctrineTestHelper;
16+
use Symfony\Bridge\Doctrine\Tests\Fixtures\BaseUser;
1617
use Symfony\Bridge\Doctrine\Tests\Fixtures\DoctrineLoaderEntity;
1718
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
1819
use Symfony\Bridge\Doctrine\Validator\DoctrineLoader;
@@ -72,6 +73,30 @@ public function testLoadClassMetadata()
7273
$this->assertSame(1, $alreadyMappedMaxLengthConstraints[0]->min);
7374
}
7475

76+
public function testFieldMappingsConfiguration()
77+
{
78+
if (!method_exists(ValidatorBuilder::class, 'addLoader')) {
79+
$this->markTestSkipped('Auto-mapping requires symfony/validation 4.2+');
80+
}
81+
82+
$validator = Validation::createValidatorBuilder()
83+
->enableAnnotationMapping()
84+
->addXmlMappings([__DIR__.'/../Resources/validator/BaseUser.xml'])
85+
->addLoader(
86+
new DoctrineLoader(
87+
DoctrineTestHelper::createTestEntityManager(
88+
DoctrineTestHelper::createTestConfigurationWithXmlLoader()
89+
), '{}'
90+
)
91+
)
92+
->getValidator();
93+
94+
$classMetadata = $validator->getMetadataFor(new BaseUser(1, 'DemoUser'));
95+
96+
$constraints = $classMetadata->getConstraints();
97+
$this->assertCount(0, $constraints);
98+
}
99+
75100
/**
76101
* @dataProvider regexpProvider
77102
*/

src/Symfony/Bridge/Doctrine/Validator/DoctrineLoader.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public function loadClassMetadata(ClassMetadata $metadata): bool
6868

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

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy