/** * @test */ public function mapReturnsObjectForOldTxClasses() { /** @var \TYPO3\CMS\Extbase\Object\ObjectManagerInterface|\PHPUnit_Framework_MockObject_MockObject $objectManager */ $objectManager = $this->getMock('TYPO3\\CMS\\Extbase\\Object\\ObjectManager'); $objectManager->expects($this->at(0))->method('get')->will($this->returnValue($this->getMock('Tx_Extbase_Tests_Fixture_TxClassWithGettersAndSetters'))); $this->subject->_set('objectManager', $objectManager); $source = array('property1' => 'foo', 'property2' => 'bar'); $expectedObject = $this->getMock('Tx_Extbase_Tests_Fixture_TxClassWithGettersAndSetters'); $expectedObject->setProperty1($source['property1']); $expectedObject->setProperty2($source['property2']); $this->assertEquals($expectedObject, $this->subject->map(array('property1', 'property2'), $source, 'Tx_Extbase_Tests_Fixture_TxClassWithGettersAndSetters')); }
/** * Checks if the value is a UUID or an array but should be an object, i.e. * the argument's data type class schema is set. If that is the case, this * method tries to look up the corresponding object instead. * * Additionally, it maps arrays to objects in case it is a normal object. * * @param mixed $value The value of an argument * @throws \TYPO3\CMS\Extbase\Mvc\Exception\InvalidArgumentValueException * @return mixed * @deprecated since Extbase 1.4.0, will be removed two versions after Extbase 6.1 */ protected function transformValue($value) { if (!class_exists($this->dataType)) { return $value; } $transformedValue = NULL; if ($this->dataTypeClassSchema !== NULL) { // The target object is an Entity or ValueObject. if (is_numeric($value)) { $this->origin = self::ORIGIN_PERSISTENCE; $transformedValue = $this->findObjectByUid($value); } elseif (is_array($value)) { $this->origin = self::ORIGIN_PERSISTENCE_AND_MODIFIED; $transformedValue = $this->deprecatedPropertyMapper->map(array_keys($value), $value, $this->dataType); } } else { if (!is_array($value)) { throw new \TYPO3\CMS\Extbase\Mvc\Exception\InvalidArgumentValueException('The value was a simple type, so we could not map it to an object. Maybe the @entity or @valueobject annotations are missing?', 1251730701); } $this->origin = self::ORIGIN_NEWLY_CREATED; $transformedValue = $this->deprecatedPropertyMapper->map(array_keys($value), $value, $this->dataType); } if (!$transformedValue instanceof $this->dataType && ($transformedValue !== NULL || $this->isRequired())) { throw new \TYPO3\CMS\Extbase\Mvc\Exception\InvalidArgumentValueException('The value must be of type "' . $this->dataType . '", but was of type "' . (is_object($transformedValue) ? get_class($transformedValue) : gettype($transformedValue)) . '".' . ($this->deprecatedPropertyMapper->getMappingResults()->hasErrors() ? '<p>' . implode('<br />', $this->deprecatedPropertyMapper->getMappingResults()->getErrors()) . '</p>' : ''), 1251730702); } return $transformedValue; }