[Validator] deprecate member metadata accessors in favor of existing property metadata accessors

add changelog for deprecations

fix test
This commit is contained in:
Tobias Schultze 2014-08-19 16:41:47 +02:00
parent 229355618b
commit 04eb61b80e
7 changed files with 50 additions and 27 deletions

View File

@ -15,8 +15,10 @@ use Symfony\Component\Form\FormTypeGuesserInterface;
use Symfony\Component\Form\Guess\Guess; use Symfony\Component\Form\Guess\Guess;
use Symfony\Component\Form\Guess\TypeGuess; use Symfony\Component\Form\Guess\TypeGuess;
use Symfony\Component\Form\Guess\ValueGuess; use Symfony\Component\Form\Guess\ValueGuess;
use Symfony\Component\Validator\MetadataFactoryInterface;
use Symfony\Component\Validator\Constraint; use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\Mapping\ClassMetadataInterface;
use Symfony\Component\Validator\Mapping\GenericMetadata;
use Symfony\Component\Validator\MetadataFactoryInterface;
class ValidatorTypeGuesser implements FormTypeGuesserInterface class ValidatorTypeGuesser implements FormTypeGuesserInterface
{ {
@ -264,10 +266,14 @@ class ValidatorTypeGuesser implements FormTypeGuesserInterface
$guesses = array(); $guesses = array();
$classMetadata = $this->metadataFactory->getMetadataFor($class); $classMetadata = $this->metadataFactory->getMetadataFor($class);
if ($classMetadata->hasMemberMetadatas($property)) { if ($classMetadata instanceof ClassMetadataInterface && $classMetadata->hasPropertyMetadata($property)) {
$memberMetadatas = $classMetadata->getMemberMetadatas($property); $memberMetadatas = $classMetadata->getPropertyMetadata($property);
foreach ($memberMetadatas as $memberMetadata) { foreach ($memberMetadatas as $memberMetadata) {
if (!$memberMetadata instanceof GenericMetadata) {
continue;
}
$constraints = $memberMetadata->getConstraints(); $constraints = $memberMetadata->getConstraints();
foreach ($constraints as $constraint) { foreach ($constraints as $constraint) {

View File

@ -23,7 +23,7 @@
"symfony/property-access": "~2.3" "symfony/property-access": "~2.3"
}, },
"require-dev": { "require-dev": {
"symfony/validator": "~2.2", "symfony/validator": "~2.3",
"symfony/http-foundation": "~2.2", "symfony/http-foundation": "~2.2",
"symfony/http-kernel": "~2.4", "symfony/http-kernel": "~2.4",
"symfony/security-csrf": "~2.4", "symfony/security-csrf": "~2.4",

View File

@ -8,6 +8,9 @@ CHANGELOG
* [BC BREAK] `UserPasswordValidator` source message change * [BC BREAK] `UserPasswordValidator` source message change
* [BC BREAK] added internal `ExecutionContextInterface::setConstraint()` * [BC BREAK] added internal `ExecutionContextInterface::setConstraint()`
* added `ConstraintViolation::getConstraint()` * added `ConstraintViolation::getConstraint()`
* deprecated `ClassMetadata::hasMemberMetadatas()`
* deprecated `ClassMetadata::getMemberMetadatas()`
* deprecated `ClassMetadata::addMemberMetadata()`
2.5.0 2.5.0
----- -----

View File

@ -160,7 +160,7 @@ class ClassMetadata extends ElementMetadata implements LegacyMetadataInterface,
$pathPrefix = empty($propertyPath) ? '' : $propertyPath.'.'; $pathPrefix = empty($propertyPath) ? '' : $propertyPath.'.';
foreach ($this->getConstrainedProperties() as $property) { foreach ($this->getConstrainedProperties() as $property) {
foreach ($this->getMemberMetadatas($property) as $member) { foreach ($this->getPropertyMetadata($property) as $member) {
$member->accept($visitor, $member->getPropertyValue($value), $group, $pathPrefix.$property, $propagatedGroup); $member->accept($visitor, $member->getPropertyValue($value), $group, $pathPrefix.$property, $propagatedGroup);
} }
} }
@ -268,7 +268,7 @@ class ClassMetadata extends ElementMetadata implements LegacyMetadataInterface,
if (!isset($this->properties[$property])) { if (!isset($this->properties[$property])) {
$this->properties[$property] = new PropertyMetadata($this->getClassName(), $property); $this->properties[$property] = new PropertyMetadata($this->getClassName(), $property);
$this->addMemberMetadata($this->properties[$property]); $this->addPropertyMetadata($this->properties[$property]);
} }
$constraint->addImplicitGroupName($this->getDefaultGroup()); $constraint->addImplicitGroupName($this->getDefaultGroup());
@ -294,7 +294,7 @@ class ClassMetadata extends ElementMetadata implements LegacyMetadataInterface,
if (!isset($this->getters[$property])) { if (!isset($this->getters[$property])) {
$this->getters[$property] = new GetterMetadata($this->getClassName(), $property); $this->getters[$property] = new GetterMetadata($this->getClassName(), $property);
$this->addMemberMetadata($this->getters[$property]); $this->addPropertyMetadata($this->getters[$property]);
} }
$constraint->addImplicitGroupName($this->getDefaultGroup()); $constraint->addImplicitGroupName($this->getDefaultGroup());
@ -316,16 +316,18 @@ class ClassMetadata extends ElementMetadata implements LegacyMetadataInterface,
} }
foreach ($source->getConstrainedProperties() as $property) { foreach ($source->getConstrainedProperties() as $property) {
foreach ($source->getMemberMetadatas($property) as $member) { foreach ($source->getPropertyMetadata($property) as $member) {
$member = clone $member; $member = clone $member;
if ($member instanceof GenericMetadata) {
foreach ($member->getConstraints() as $constraint) { foreach ($member->getConstraints() as $constraint) {
$constraint->addImplicitGroupName($this->getDefaultGroup()); $constraint->addImplicitGroupName($this->getDefaultGroup());
} }
}
$this->addMemberMetadata($member); $this->addPropertyMetadata($member);
if (!$member->isPrivate($this->name)) { if ($member instanceof MemberMetadata && !$member->isPrivate($this->name)) {
$property = $member->getPropertyName(); $property = $member->getPropertyName();
if ($member instanceof PropertyMetadata && !isset($this->properties[$property])) { if ($member instanceof PropertyMetadata && !isset($this->properties[$property])) {
@ -342,12 +344,12 @@ class ClassMetadata extends ElementMetadata implements LegacyMetadataInterface,
* Adds a member metadata. * Adds a member metadata.
* *
* @param MemberMetadata $metadata * @param MemberMetadata $metadata
*
* @deprecated Deprecated since version 2.6, to be removed in 3.0.
*/ */
protected function addMemberMetadata(MemberMetadata $metadata) protected function addMemberMetadata(MemberMetadata $metadata)
{ {
$property = $metadata->getPropertyName(); $this->addPropertyMetadata($metadata);
$this->members[$property][] = $metadata;
} }
/** /**
@ -356,10 +358,12 @@ class ClassMetadata extends ElementMetadata implements LegacyMetadataInterface,
* @param string $property The name of the property * @param string $property The name of the property
* *
* @return bool * @return bool
*
* @deprecated Deprecated since version 2.6, to be removed in 3.0. Use {@link hasPropertyMetadata} instead.
*/ */
public function hasMemberMetadatas($property) public function hasMemberMetadatas($property)
{ {
return array_key_exists($property, $this->members); return $this->hasPropertyMetadata($property);
} }
/** /**
@ -368,14 +372,12 @@ class ClassMetadata extends ElementMetadata implements LegacyMetadataInterface,
* @param string $property The name of the property * @param string $property The name of the property
* *
* @return MemberMetadata[] An array of MemberMetadata * @return MemberMetadata[] An array of MemberMetadata
*
* @deprecated Deprecated since version 2.6, to be removed in 3.0. Use {@link getPropertyMetadata} instead.
*/ */
public function getMemberMetadatas($property) public function getMemberMetadatas($property)
{ {
if (!isset($this->members[$property])) { return $this->getPropertyMetadata($property);
return array();
}
return $this->members[$property];
} }
/** /**
@ -505,4 +507,16 @@ class ClassMetadata extends ElementMetadata implements LegacyMetadataInterface,
{ {
return CascadingStrategy::NONE; return CascadingStrategy::NONE;
} }
/**
* Adds a property metadata.
*
* @param PropertyMetadataInterface $metadata
*/
private function addPropertyMetadata(PropertyMetadataInterface $metadata)
{
$property = $metadata->getPropertyName();
$this->members[$property][] = $metadata;
}
} }

View File

@ -15,7 +15,7 @@ use Symfony\Component\Validator\Mapping\ClassMetadata;
class FakeClassMetadata extends ClassMetadata class FakeClassMetadata extends ClassMetadata
{ {
public function addPropertyMetadata($propertyName, $metadata) public function addCustomPropertyMetadata($propertyName, $metadata)
{ {
if (!isset($this->members[$propertyName])) { if (!isset($this->members[$propertyName])) {
$this->members[$propertyName] = array(); $this->members[$propertyName] = array();

View File

@ -101,7 +101,7 @@ class ClassMetadataTest extends \PHPUnit_Framework_TestCase
))), ))),
); );
$members = $this->metadata->getMemberMetadatas('firstName'); $members = $this->metadata->getPropertyMetadata('firstName');
$this->assertCount(1, $members); $this->assertCount(1, $members);
$this->assertEquals(self::PARENTCLASS, $members[0]->getClassName()); $this->assertEquals(self::PARENTCLASS, $members[0]->getClassName());
@ -112,8 +112,8 @@ class ClassMetadataTest extends \PHPUnit_Framework_TestCase
{ {
$this->metadata->addPropertyConstraint('firstName', new ConstraintA()); $this->metadata->addPropertyConstraint('firstName', new ConstraintA());
$this->assertTrue($this->metadata->hasMemberMetadatas('firstName')); $this->assertTrue($this->metadata->hasPropertyMetadata('firstName'));
$this->assertFalse($this->metadata->hasMemberMetadatas('non_existant_field')); $this->assertFalse($this->metadata->hasPropertyMetadata('non_existant_field'));
} }
public function testMergeConstraintsKeepsPrivateMembersSeparate() public function testMergeConstraintsKeepsPrivateMembersSeparate()
@ -138,7 +138,7 @@ class ClassMetadataTest extends \PHPUnit_Framework_TestCase
))), ))),
); );
$members = $this->metadata->getMemberMetadatas('internal'); $members = $this->metadata->getPropertyMetadata('internal');
$this->assertCount(2, $members); $this->assertCount(2, $members);
$this->assertEquals(self::PARENTCLASS, $members[0]->getClassName()); $this->assertEquals(self::PARENTCLASS, $members[0]->getClassName());

View File

@ -633,7 +633,7 @@ abstract class Abstract2Dot5ApiTest extends AbstractValidatorTest
// Legacy interface // Legacy interface
$propertyMetadata = $this->getMock('Symfony\Component\Validator\MetadataInterface'); $propertyMetadata = $this->getMock('Symfony\Component\Validator\MetadataInterface');
$metadata = new FakeClassMetadata(get_class($entity)); $metadata = new FakeClassMetadata(get_class($entity));
$metadata->addPropertyMetadata('firstName', $propertyMetadata); $metadata->addCustomPropertyMetadata('firstName', $propertyMetadata);
$this->metadataFactory->addMetadata($metadata); $this->metadataFactory->addMetadata($metadata);