/** * * @param \EBT\ExtensionBuilder\Domain\Model\DomainObject\AbstractProperty $property * @param string $methodType (set,add,remove) * @return string method body */ public static function getParameterName(AbstractProperty $domainProperty, $methodType) { $propertyName = $domainProperty->getName(); switch ($methodType) { case 'set': return $propertyName; case 'add': return \EBT\ExtensionBuilder\Utility\Inflector::singularize($propertyName); case 'remove': return \EBT\ExtensionBuilder\Utility\Inflector::singularize($propertyName) . 'ToRemove'; } }
/** * Write a simple model class for a non aggregate root domain object with one to one relation * * @test */ function writeModelClassWithManyToManyRelation() { $modelName = 'ModelCgt5'; $relatedModelName = 'RelatedModel'; $propertyName = 'relNames'; $domainObject = $this->buildDomainObject($modelName); $relatedDomainObject = $this->buildDomainObject($relatedModelName); $relation = new Relation\ManyToManyRelation($propertyName); $relation->setForeignModel($relatedDomainObject); $relation->setInlineEditing(false); $domainObject->addProperty($relation); $classFileContent = $this->fileGenerator->generateDomainObjectCode($domainObject, false); $modelClassDir = 'Classes/Domain/Model/'; \TYPO3\CMS\Core\Utility\GeneralUtility::mkdir_deep($this->extension->getExtensionDir(), $modelClassDir); $absModelClassDir = $this->extension->getExtensionDir() . $modelClassDir; $this->assertTrue(is_dir($absModelClassDir), 'Directory ' . $absModelClassDir . ' was not created'); $modelClassPath = $absModelClassDir . $domainObject->getName() . '.php'; \TYPO3\CMS\Core\Utility\GeneralUtility::writeFile($modelClassPath, $classFileContent); $this->assertFileExists($modelClassPath, 'File was not generated: ' . $modelClassPath); $className = $domainObject->getFullQualifiedClassName(); if (!class_exists($className)) { include $modelClassPath; } $this->assertTrue(class_exists($className), 'Class was not generated:' . $className); $reflection = new \TYPO3\CMS\Extbase\Reflection\ClassReflection($className); $this->assertTrue($reflection->hasMethod('add' . ucfirst(Inflector::singularize($propertyName))), 'Add method was not generated'); $this->assertTrue($reflection->hasMethod('remove' . ucfirst(Inflector::singularize($propertyName))), 'Remove method was not generated'); $this->assertTrue($reflection->hasMethod('get' . ucfirst($propertyName)), 'Getter was not generated'); $this->assertTrue($reflection->hasMethod('set' . ucfirst($propertyName)), 'Setter was not generated'); $this->assertTrue($reflection->hasMethod('initStorageObjects'), 'initStorageObjects was not generated'); //checking methods $setterMethod = $reflection->getMethod('set' . ucfirst($propertyName)); $this->assertTrue($setterMethod->isTaggedWith('param'), 'No param tag set for setter method'); $paramTagValues = $setterMethod->getTagValues('param'); $this->assertEquals(0, strpos($paramTagValues[0], '\\TYPO3\\CMS\\Extbase\\Persistence\\ObjectStorage<' . $relatedDomainObject->getFullQualifiedClassName()), 'Wrong param tag:' . $paramTagValues[0]); $parameters = $setterMethod->getParameters(); $this->assertEquals(1, count($parameters), 'Wrong parameter count in setter method'); $parameter = current($parameters); $this->assertEquals($parameter->getName(), $propertyName, 'Wrong parameter name in setter method'); $addMethod = $reflection->getMethod('add' . ucfirst(Inflector::singularize($propertyName))); $this->assertTrue($addMethod->isTaggedWith('param'), 'No param tag set for setter method'); $paramTagValues = $addMethod->getTagValues('param'); $this->assertEquals(0, strpos($paramTagValues[0], $relatedDomainObject->getFullQualifiedClassName()), 'Wrong param tag:' . $paramTagValues[0]); $parameters = $addMethod->getParameters(); $this->assertEquals(1, count($parameters), 'Wrong parameter count in add method'); $parameter = current($parameters); $this->assertEquals($parameter->getName(), Inflector::singularize($propertyName), 'Wrong parameter name in add method'); $removeMethod = $reflection->getMethod('remove' . ucfirst(Inflector::singularize($propertyName))); $this->assertTrue($removeMethod->isTaggedWith('param'), 'No param tag set for remove method'); $paramTagValues = $removeMethod->getTagValues('param'); $this->assertEquals(0, strpos($paramTagValues[0], $relatedDomainObject->getFullQualifiedClassName()), 'Wrong param tag:' . $paramTagValues[0]); $parameters = $removeMethod->getParameters(); $this->assertEquals(1, count($parameters), 'Wrong parameter count in remove method'); $parameter = current($parameters); $this->assertEquals($parameter->getName(), Inflector::singularize($propertyName) . 'ToRemove', 'Wrong parameter name in remove method'); }
/** * Singularize a word * * @return string The pluralized string * @author Sebastian Kurfürst <*****@*****.**> */ public function render() { $content = $this->renderChildren(); return $this->inflector->singularize($content); }
/** * @test */ public function classBuilderGeneratesMethodsForRelationProperty() { $modelName2 = 'Model2'; $propertyName = 'relNames'; $domainObject1 = $this->buildDomainObject($this->modelName, true, true); $relatedDomainObject = $this->buildDomainObject($modelName2); $relationProperty = new \EBT\ExtensionBuilder\Domain\Model\DomainObject\Relation\ManyToManyRelation($propertyName); $relationProperty->setForeignModel($relatedDomainObject); $domainObject1->addProperty($relationProperty); $modelClassObject = $this->classBuilder->generateModelClassFileObject($domainObject1, $this->modelClassTemplatePath, FALSE)->getFirstClass(); $this->assertTrue($modelClassObject->methodExists('add' . ucfirst(Inflector::singularize($propertyName))), 'Add method was not generated'); $this->assertTrue($modelClassObject->methodExists('remove' . ucfirst(Inflector::singularize($propertyName))), 'Remove method was not generated'); $this->assertTrue($modelClassObject->methodExists('set' . ucfirst($propertyName)), 'Setter was not generated'); $this->assertTrue($modelClassObject->methodExists('set' . ucfirst($propertyName)), 'Setter was not generated'); $addMethod = $modelClassObject->getMethod('add' . ucfirst(Inflector::singularize($propertyName))); $this->assertTrue($addMethod->isTaggedWith('param'), 'No param tag set for setter method'); $paramTagValues = $addMethod->getTagValues('param'); $this->assertTrue(strpos($paramTagValues, $relatedDomainObject->getFullQualifiedClassName()) === 0, 'Wrong param tag:' . $paramTagValues); $parameters = $addMethod->getParameters(); $this->assertTrue(count($parameters) == 1, 'Wrong parameter count in add method'); $parameter = current($parameters); $this->assertTrue($parameter->getName() == Inflector::singularize($propertyName), 'Wrong parameter name in add method'); $this->assertTrue($parameter->getTypeHint() == $relatedDomainObject->getFullQualifiedClassName(), 'Wrong type hint for add method parameter:' . $parameter->getTypeHint()); }
/** * * @param \EBT\ExtensionBuilder\Domain\Model\DomainObject\AbstractProperty $domainProperty * @param string $methodType (set,add,remove) * @return string method body */ public static function getParameterName($domainProperty, $methodType) { $propertyName = $domainProperty->getName(); switch ($methodType) { case 'set': return $propertyName; case 'add': return Inflector::singularize($propertyName); case 'remove': return Inflector::singularize($propertyName) . 'ToRemove'; } }
/** * Removes all related methods, if a property was removed * @param \EBT\ExtensionBuilder\Domain\Model\DomainObject\AbstractProperty $propertyToRemove * * @return void */ protected function removePropertyAndRelatedMethods($propertyToRemove) { $propertyName = $propertyToRemove->getName(); $this->classObject->removeProperty($propertyName); if ($propertyToRemove->isAnyToManyRelation()) { $this->classObject->removeMethod('add' . ucfirst(Inflector::singularize($propertyName))); $this->classObject->removeMethod('remove' . ucfirst(Inflector::singularize($propertyName))); GeneralUtility::devLog('Methods removed: ' . 'add' . ucfirst(Inflector::singularize($propertyName)), 'extension_builder'); } $this->classObject->removeMethod('get' . ucfirst($propertyName)); $this->classObject->removeMethod('set' . ucfirst($propertyName)); if ($propertyToRemove->isBoolean()) { $this->classObject->removeMethod('is' . ucfirst($propertyName)); } GeneralUtility::devLog('Methods removed: ' . 'get' . ucfirst($propertyName), 'extension_builder'); }