1
0
mirror of synced 2024-12-05 03:06:05 +03:00

[2.0] Finishing the AnnotationExporter to export relationships properly

This commit is contained in:
jwage 2009-10-08 22:11:10 +00:00
parent aba096cc66
commit 204b6d71f3
5 changed files with 140 additions and 33 deletions

View File

@ -40,10 +40,17 @@ class AnnotationExporter extends AbstractExporter
private $_isNew = false;
private $_outputPath;
private $_numSpaces = 4;
private $_numSpaces;
private $_spaces;
private $_classToExtend;
private $_currentCode;
public function __construct($dir = null)
{
parent::__construct($dir);
$this->setNumSpaces(4);
}
/**
* Converts a single ClassMetadata instance to the exported format
* and returns it
@ -102,6 +109,7 @@ class AnnotationExporter extends AbstractExporter
*/
public function setNumSpaces($numSpaces)
{
$this->_spaces = str_repeat(' ', $numSpaces);
$this->_numSpaces = $numSpaces;
}
@ -212,34 +220,34 @@ class AnnotationExporter extends AbstractExporter
}
$method = array();
$method[] = str_repeat(' ', $this->_numSpaces) . '/**';
$method[] = $this->_spaces . '/**';
if ($type == 'get') {
$method[] = str_repeat(' ', $this->_numSpaces) . ' * Get ' . $fieldName;
$method[] = $this->_spaces . ' * Get ' . $fieldName;
} else if ($type == 'set') {
$method[] = str_repeat(' ', $this->_numSpaces) . ' * Set ' . $fieldName;
$method[] = $this->_spaces . ' * Set ' . $fieldName;
} else if ($type == 'add') {
$method[] = str_repeat(' ', $this->_numSpaces) . ' * Add ' . $fieldName;
$method[] = $this->_spaces . ' * Add ' . $fieldName;
}
$method[] = str_repeat(' ', $this->_numSpaces) . ' */';
$method[] = $this->_spaces . ' */';
if ($type == 'get') {
$method[] = str_repeat(' ', $this->_numSpaces) . 'public function ' . $methodName . '()';
$method[] = $this->_spaces . 'public function ' . $methodName . '()';
} else if ($type == 'set') {
$method[] = str_repeat(' ', $this->_numSpaces) . 'public function ' . $methodName . '($value)';
$method[] = $this->_spaces . 'public function ' . $methodName . '($value)';
} else if ($type == 'add') {
$method[] = str_repeat(' ', $this->_numSpaces) . 'public function ' . $methodName . '($value)';
$method[] = $this->_spaces . 'public function ' . $methodName . '($value)';
}
$method[] = str_repeat(' ', $this->_numSpaces) . '{';
$method[] = $this->_spaces . '{';
if ($type == 'get') {
$method[] = str_repeat(' ', $this->_numSpaces) . str_repeat(' ', $this->_numSpaces) . 'return $this->' . $fieldName . ';';
$method[] = $this->_spaces . $this->_spaces . 'return $this->' . $fieldName . ';';
} else if ($type == 'set') {
$method[] = str_repeat(' ', $this->_numSpaces) . str_repeat(' ', $this->_numSpaces) . '$this->' . $fieldName . ' = $value;';
$method[] = $this->_spaces . $this->_spaces . '$this->' . $fieldName . ' = $value;';
} else if ($type == 'add') {
$method[] = str_repeat(' ', $this->_numSpaces) . str_repeat(' ', $this->_numSpaces) . '$this->' . $fieldName . '[] = $value;';
$method[] = $this->_spaces . $this->_spaces . '$this->' . $fieldName . '[] = $value;';
}
$method[] = str_repeat(' ', $this->_numSpaces) . '}';
$method[] = $this->_spaces . '}';
$method[] = "\n";
$methods[] = implode("\n", $method);
@ -288,13 +296,90 @@ class AnnotationExporter extends AbstractExporter
return '@Table(' . implode(', ', $table) . ')';
}
private function _getJoinColumnAnnotation(array $joinColumn)
{
$joinColumnAnnot = array();
if (isset($joinColumn['name'])) {
$joinColumnAnnot[] = 'name="' . $joinColumn['name'] . '"';
}
if (isset($joinColumn['referencedColumnName'])) {
$joinColumnAnnot[] = 'referencedColumnName="' . $joinColumn['referencedColumnName'] . '"';
}
if (isset($joinColumn['unique']) && $joinColumn['unique']) {
$joinColumnAnnot[] = 'unique=' . ($joinColumn['unique'] ? 'true' : 'false');
}
if (isset($joinColumn['nullable'])) {
$joinColumnAnnot[] = 'nullable=' . ($joinColumn['nullable'] ? 'true' : 'false');
}
if (isset($joinColumn['onDelete'])) {
$joinColumnAnnot[] = 'onDelete=' . ($joinColumn['onDelete'] ? 'true' : 'false');
}
if (isset($joinColumn['onUpdate'])) {
$joinColumnAnnot[] = 'onUpdate=' . ($joinColumn['onUpdate'] ? 'true' : 'false');
}
return '@JoinColumn(' . implode(', ', $joinColumnAnnot) . ')';
}
private function _getAssociationMappingAnnotation(AssociationMapping $associationMapping, ClassMetadataInfo $metadata)
{
// TODO: This function still needs to be written :)
$e = explode('\\', get_class($associationMapping));
$type = str_replace('Mapping', '', end($e));
$typeOptions = array();
if (isset($associationMapping->targetEntityName)) {
$typeOptions[] = 'targetEntity="' . $associationMapping->targetEntityName . '"';
}
if (isset($associationMapping->mappedByFieldName)) {
$typeOptions[] = 'mappedBy="' . $associationMapping->mappedByFieldName . '"';
}
if (isset($associationMapping->cascades) && $associationMapping->cascades) {
$typeOptions[] = 'cascade={"' . implode('"', $associationMapping->cascades) . '"}';
}
if (isset($associationMapping->orphanRemoval) && $associationMapping->orphanRemoval) {
$typeOptions[] = 'orphanRemoval=' . ($associationMapping->orphanRemoval ? 'true' : 'false');
}
$lines = array();
$lines[] = str_repeat(' ', $this->_numSpaces) . '/**';
$lines[] = str_repeat(' ', $this->_numSpaces) . ' *';
$lines[] = str_repeat(' ', $this->_numSpaces) . ' */';
$lines[] = $this->_spaces . '/**';
$lines[] = $this->_spaces . ' * @' . $type . '(' . implode(', ', $typeOptions) . ')';
if (isset($associationMapping->joinColumns) && $associationMapping->joinColumns) {
$lines[] = $this->_spaces . ' * @JoinColumns({';
$joinColumnsLines = array();
foreach ($associationMapping->joinColumns as $joinColumn) {
if ($joinColumnAnnot = $this->_getJoinColumnAnnotation($joinColumn)) {
$joinColumnsLines[] = $this->_spaces . ' * ' . $joinColumnAnnot;
}
}
$lines[] = implode(",\n", $joinColumnsLines);
$lines[] = $this->_spaces . ' * })';
}
if (isset($associationMapping->joinTable) && $associationMapping->joinTable) {
$joinTable = array();
$joinTable[] = 'name="' . $associationMapping->joinTable['name'] . '"';
if (isset($associationMapping->joinTable['schema'])) {
$joinTable[] = 'schema="' . $associationMapping->joinTable['schema'] . '"';
}
$lines[] = $this->_spaces . ' * @JoinTable(' . implode(', ', $joinTable) . ',';
$lines[] = $this->_spaces . ' * joinColumns={';
foreach ($associationMapping->joinTable['joinColumns'] as $joinColumn) {
$lines[] = $this->_spaces . ' * ' . $this->_getJoinColumnAnnotation($joinColumn);
}
$lines[] = $this->_spaces . ' * },';
$lines[] = $this->_spaces . ' * inverseJoinColumns={';
foreach ($associationMapping->joinTable['inverseJoinColumns'] as $joinColumn) {
$lines[] = $this->_spaces . ' * ' . $this->_getJoinColumnAnnotation($joinColumn);
}
$lines[] = $this->_spaces . ' * }';
$lines[] = $this->_spaces . ' * )';
}
$lines[] = $this->_spaces . ' */';
return implode("\n", $lines);
}
@ -302,7 +387,7 @@ class AnnotationExporter extends AbstractExporter
private function _getFieldMappingAnnotation(array $fieldMapping, ClassMetadataInfo $metadata)
{
$lines = array();
$lines[] = str_repeat(' ', $this->_numSpaces) . '/**';
$lines[] = $this->_spaces . '/**';
$column = array();
if (isset($fieldMapping['columnName'])) {
@ -330,16 +415,18 @@ class AnnotationExporter extends AbstractExporter
$value = str_replace("'", '"', $value);
$options[] = ! is_numeric($key) ? $key . '=' . $value:$value;
}
$column[] = 'options={' . implode(', ', $options) . '}';
if ($options) {
$column[] = 'options={' . implode(', ', $options) . '}';
}
}
if (isset($fieldMapping['unique'])) {
$column[] = 'unique=' . var_export($fieldMapping['unique'], true);
}
$lines[] = str_repeat(' ', $this->_numSpaces) . ' * @Column(' . implode(', ', $column) . ')';
$lines[] = $this->_spaces . ' * @Column(' . implode(', ', $column) . ')';
if (isset($fieldMapping['id']) && $fieldMapping['id']) {
$lines[] = str_repeat(' ', $this->_numSpaces) . ' * @Id';
$lines[] = $this->_spaces . ' * @Id';
if ($generatorType = $this->_getIdGeneratorTypeString($metadata->generatorType)) {
$lines[] = str_repeat(' ', $this->_numSpaces).' * @GeneratedValue(strategy="' . $generatorType . '")';
$lines[] = $this->_spaces.' * @GeneratedValue(strategy="' . $generatorType . '")';
}
if ($metadata->sequenceGeneratorDefinition) {
$sequenceGenerator = array();
@ -352,13 +439,13 @@ class AnnotationExporter extends AbstractExporter
if (isset($metadata->sequenceGeneratorDefinition['initialValue'])) {
$sequenceGenerator[] = 'initialValue="' . $metadata->sequenceGeneratorDefinition['initialValue'] . '"';
}
$lines[] = str_repeat(' ', $this->_numSpaces) . ' * @SequenceGenerator(' . implode(', ', $sequenceGenerator) . ')';
$lines[] = $this->_spaces . ' * @SequenceGenerator(' . implode(', ', $sequenceGenerator) . ')';
}
}
if (isset($fieldMapping['version']) && $fieldMapping['version']) {
$lines[] = str_repeat(' ', $this->_numSpaces) . ' * @Version';
$lines[] = $this->_spaces . ' * @Version';
}
$lines[] = str_repeat(' ', $this->_numSpaces) . ' */';
$lines[] = $this->_spaces . ' */';
return implode("\n", $lines);
}

View File

@ -11,7 +11,7 @@ class Address {
private $id;
/** @Column(type="string", length=255) */
private $street;
/** @OneToOne(targetEntity="User", mappedBy="address") */
/** @OneToOne(targetEntity="User", mappedBy="address", cascade={"persist"}) */
private $user;
public function getId() {

View File

@ -15,9 +15,20 @@ class User {
private $test;
/**
* @OneToOne(targetEntity="Address")
* @JoinColumn(name="address_id", referencedColumnName="id")
* @JoinColumns({
* @JoinColumn(name="address_id", referencedColumnName="id"),
* @JoinColumn(name="address2_id", referencedColumnName="id")
* })
*/
private $address;
/**
* @ManyToMany(targetEntity="Group")
* @JoinTable(name="user_group",
* joinColumns={@JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@JoinColumn(name="group_id", referencedColumnName="id")
* })
*/
private $groups;
public function getId() {
return $this->id;

View File

@ -23,8 +23,10 @@ $config = new \Doctrine\ORM\Configuration();
$config->setMetadataCacheImpl(new \Doctrine\Common\Cache\ArrayCache);
$connectionOptions = array(
'driver' => 'pdo_sqlite',
'path' => 'database.sqlite'
'driver' => 'pdo_mysql',
'user' => 'root',
'password' => '',
'dbname' => 'doctrine2'
);
$em = \Doctrine\ORM\EntityManager::create($connectionOptions, $config);

View File

@ -14,7 +14,7 @@ $classLoader->register();
// Set up caches
$config = new \Doctrine\ORM\Configuration;
$cache = new \Doctrine\Common\Cache\ApcCache;
$cache = new \Doctrine\Common\Cache\ArrayCache;
$config->setMetadataCacheImpl($cache);
$config->setQueryCacheImpl($cache);
@ -30,6 +30,13 @@ $em = \Doctrine\ORM\EntityManager::create($connectionOptions, $config);
## PUT YOUR TEST CODE BELOW
$user = new User;
$address = new Address;
$user->setName('jwage');
echo "Hello World!";
$address = new Address;
$address->setStreet('6512 Mercomatic Court');
$address->setUser($user);
$user->setAddress($address);
$em->persist($user);
$em->persist($address);
$em->flush();