Skip to content

Commit

Permalink
Merge pull request #1006 from Trainmaster/master
Browse files Browse the repository at this point in the history
Handling invalid discriminator values
  • Loading branch information
guilhermeblanco committed Apr 15, 2014
2 parents 3a1e24e + 8740d54 commit 2da74e5
Show file tree
Hide file tree
Showing 5 changed files with 88 additions and 2 deletions.
14 changes: 14 additions & 0 deletions lib/Doctrine/ORM/Internal/Hydration/HydrationException.php
Original file line number Diff line number Diff line change
Expand Up @@ -88,4 +88,18 @@ public static function missingDiscriminatorMetaMappingColumn($entityName, $discr
$discrColumnName, $entityName, $dqlAlias
));
}

/**
* @param string $discrValue
* @param array $discrMap
*
* @return HydrationException
*/
public static function invalidDiscriminatorValue($discrValue, $discrMap)
{
return new self(sprintf(
'The discriminator value "%s" is invalid. It must be one of "%s".',
$discrValue, implode('", "', $discrMap)
));
}
}
8 changes: 7 additions & 1 deletion lib/Doctrine/ORM/Internal/Hydration/ObjectHydrator.php
Original file line number Diff line number Diff line change
Expand Up @@ -266,7 +266,13 @@ private function getEntity(array $data, $dqlAlias)
throw HydrationException::emptyDiscriminatorValue($dqlAlias);
}

$className = $this->ce[$className]->discriminatorMap[$data[$discrColumn]];
$discrMap = $this->ce[$className]->discriminatorMap;

if ( ! isset($discrMap[$data[$discrColumn]])) {
throw HydrationException::invalidDiscriminatorValue($data[$discrColumn], array_keys($discrMap));
}

$className = $discrMap[$data[$discrColumn]];

unset($data[$discrColumn]);
}
Expand Down
8 changes: 7 additions & 1 deletion lib/Doctrine/ORM/Internal/Hydration/SimpleObjectHydrator.php
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,13 @@ protected function hydrateRowData(array $sqlResult, array &$cache, array &$resul
throw HydrationException::emptyDiscriminatorValue(key($this->_rsm->aliasMap));
}

$entityName = $this->class->discriminatorMap[$sqlResult[$discrColumnName]];
$discrMap = $this->class->discriminatorMap;

if ( ! isset($discrMap[$sqlResult[$discrColumnName]])) {
throw HydrationException::invalidDiscriminatorValue($sqlResult[$discrColumnName], array_keys($discrMap));
}

$entityName = $discrMap[$sqlResult[$discrColumnName]];

unset($sqlResult[$discrColumnName]);
}
Expand Down
30 changes: 30 additions & 0 deletions tests/Doctrine/Tests/ORM/Hydration/ObjectHydratorTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -1926,4 +1926,34 @@ public function testMissingDiscriminatorColumnException()
$hydrator = new \Doctrine\ORM\Internal\Hydration\ObjectHydrator($this->_em);
$hydrator->hydrateAll($stmt, $rsm);
}

/**
* @group DDC-3076
*
* @expectedException \Doctrine\ORM\Internal\Hydration\HydrationException
* @expectedExceptionMessage The discriminator value "subworker" is invalid. It must be one of "person", "manager", "employee".
*/
public function testInvalidDiscriminatorValueException()
{
$rsm = new ResultSetMapping;

$rsm->addEntityResult('Doctrine\Tests\Models\Company\CompanyPerson', 'p');

$rsm->addFieldResult('p', 'p__id', 'id');
$rsm->addFieldResult('p', 'p__name', 'name');
$rsm->addMetaResult('p', 'discr', 'discr');
$rsm->setDiscriminatorColumn('p', 'discr');

$resultSet = array(
array(
'p__id' => '1',
'p__name' => 'Fabio B. Silva',
'discr' => 'subworker'
),
);

$stmt = new HydratorMockStatement($resultSet);
$hydrator = new \Doctrine\ORM\Internal\Hydration\ObjectHydrator($this->_em);
$hydrator->hydrateAll($stmt, $rsm);
}
}
30 changes: 30 additions & 0 deletions tests/Doctrine/Tests/ORM/Hydration/SimpleObjectHydratorTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -56,4 +56,34 @@ public function testExtraFieldInResultSetShouldBeIgnore()
$result = $hydrator->hydrateAll($stmt, $rsm);
$this->assertEquals($result[0], $expectedEntity);
}

/**
* @group DDC-3076
*
* @expectedException \Doctrine\ORM\Internal\Hydration\HydrationException
* @expectedExceptionMessage The discriminator value "subworker" is invalid. It must be one of "person", "manager", "employee".
*/
public function testInvalidDiscriminatorValueException()
{
$rsm = new ResultSetMapping;

$rsm->addEntityResult('Doctrine\Tests\Models\Company\CompanyPerson', 'p');

$rsm->addFieldResult('p', 'p__id', 'id');
$rsm->addFieldResult('p', 'p__name', 'name');
$rsm->addMetaResult('p', 'discr', 'discr');
$rsm->setDiscriminatorColumn('p', 'discr');

$resultSet = array(
array(
'p__id' => '1',
'p__name' => 'Fabio B. Silva',
'discr' => 'subworker'
),
);

$stmt = new HydratorMockStatement($resultSet);
$hydrator = new \Doctrine\ORM\Internal\Hydration\SimpleObjectHydrator($this->_em);
$hydrator->hydrateAll($stmt, $rsm);
}
}

0 comments on commit 2da74e5

Please sign in to comment.