Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
D
doctrine-dbal
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Tomáš Trávníček
doctrine-dbal
Commits
d90e71d0
Commit
d90e71d0
authored
Jun 01, 2009
by
romanb
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[2.0] First implementation of XmlDriver + tests. First draft of XSD document.
parent
de7dfb4f
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
696 additions
and
7 deletions
+696
-7
doctrine-mapping.xsd
doctrine-mapping.xsd
+143
-0
ClassLoader.php
lib/Doctrine/Common/ClassLoader.php
+1
-1
ClassMetadataFactory.php
lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php
+0
-2
AnnotationDriver.php
lib/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php
+3
-3
XmlDriver.php
lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php
+427
-0
OneToOneMapping.php
lib/Doctrine/ORM/Mapping/OneToOneMapping.php
+1
-1
AllTests.php
tests/Doctrine/Tests/ORM/Mapping/AllTests.php
+1
-0
XmlDriverTest.php
tests/Doctrine/Tests/ORM/Mapping/XmlDriverTest.php
+67
-0
User.php
tests/Doctrine/Tests/ORM/Mapping/xml/User.php
+13
-0
XmlMappingTest.User.dcm.xml
...octrine/Tests/ORM/Mapping/xml/XmlMappingTest.User.dcm.xml
+40
-0
No files found.
doctrine-mapping.xsd
0 → 100644
View file @
d90e71d0
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
xmlns:xs=
"http://www.w3.org/2001/XMLSchema"
targetNamespace=
"http://schemas.doctrine-project.org/orm/doctrine-mapping"
xmlns:orm=
"http://schemas.doctrine-project.org/orm/doctrine-mapping"
elementFormDefault=
"qualified"
>
<xs:annotation>
<xs:documentation>
<![CDATA[
This is the XML Schema for the object/relational
mapping file used by Doctrine.
]]>
</xs:documentation>
</xs:annotation>
<xs:element
name=
"doctrine-mapping"
>
<xs:complexType>
<xs:sequence>
<xs:element
name=
"entity"
type=
"orm:entity"
/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType
name=
"emptyType"
/>
<xs:complexType
name=
"cascade-type"
>
<xs:sequence>
<xs:element
name=
"cascade-all"
type=
"orm:emptyType"
minOccurs=
"0"
/>
<xs:element
name=
"cascade-save"
type=
"orm:emptyType"
minOccurs=
"0"
/>
<xs:element
name=
"cascade-merge"
type=
"orm:emptyType"
minOccurs=
"0"
/>
<xs:element
name=
"cascade-delete"
type=
"orm:emptyType"
minOccurs=
"0"
/>
<xs:element
name=
"cascade-refresh"
type=
"orm:emptyType"
minOccurs=
"0"
/>
</xs:sequence>
</xs:complexType>
<xs:complexType
name=
"entity"
>
<xs:sequence>
<xs:element
name=
"id"
type=
"orm:id"
/>
<xs:element
name=
"field"
type=
"orm:field"
minOccurs=
"0"
/>
<xs:element
name=
"one-to-one"
type=
"orm:one-to-one"
minOccurs=
"0"
/>
<xs:element
name=
"one-to-many"
type=
"orm:one-to-many"
minOccurs=
"0"
/>
<xs:element
name=
"many-to-many"
type=
"orm:many-to-many"
minOccurs=
"0"
/>
</xs:sequence>
<xs:attribute
name=
"name"
type=
"xs:string"
use=
"required"
/>
<xs:attribute
name=
"table"
type=
"xs:NMTOKEN"
/>
<xs:attribute
name=
"schema"
type=
"xs:NMTOKEN"
/>
<xs:attribute
name=
"inheritance-type"
type=
"orm:inheritance-type"
/>
</xs:complexType>
<xs:complexType
name=
"mapped-superclass"
>
<xs:sequence>
<xs:element
name=
"id"
type=
"orm:id"
minOccurs=
"0"
/>
<xs:element
name=
"field"
type=
"orm:field"
minOccurs=
"0"
/>
<xs:element
name=
"one-to-many"
type=
"orm:one-to-many"
minOccurs=
"0"
/>
<xs:element
name=
"many-to-many"
type=
"orm:many-to-many"
minOccurs=
"0"
/>
</xs:sequence>
<xs:attribute
name=
"name"
type=
"xs:NMTOKEN"
use=
"required"
/>
</xs:complexType>
<xs:simpleType
name=
"inheritance-type"
>
<xs:restriction
base=
"xs:string"
>
<xs:enumeration
value=
"single-table"
/>
<xs:enumeration
value=
"joined"
/>
<xs:enumeration
value=
"table-per-class"
/>
</xs:restriction>
</xs:simpleType>
<xs:complexType
name=
"field"
>
<xs:attribute
name=
"name"
type=
"xs:NMTOKEN"
use=
"required"
/>
<xs:attribute
name=
"type"
type=
"xs:NMTOKEN"
use=
"required"
/>
<xs:attribute
name=
"column"
type=
"xs:NMTOKEN"
/>
<xs:attribute
name=
"length"
type=
"xs:NMTOKEN"
/>
</xs:complexType>
<xs:complexType
name=
"generator"
>
<xs:attribute
name=
"strategy"
type=
"xs:NMTOKEN"
use=
"required"
/>
</xs:complexType>
<xs:complexType
name=
"id"
>
<xs:sequence>
<xs:element
name=
"generator"
type=
"orm:generator"
minOccurs=
"0"
/>
</xs:sequence>
<xs:attribute
name=
"name"
type=
"xs:NMTOKEN"
use=
"required"
/>
<xs:attribute
name=
"type"
type=
"xs:NMTOKEN"
use=
"required"
/>
<xs:attribute
name=
"column"
type=
"xs:NMTOKEN"
/>
</xs:complexType>
<xs:complexType
name=
"inverse-join-columns"
>
<xs:sequence>
<xs:element
name=
"join-column"
type=
"orm:join-column"
/>
</xs:sequence>
</xs:complexType>
<xs:complexType
name=
"join-column"
>
<xs:attribute
name=
"name"
type=
"xs:NMTOKEN"
use=
"required"
/>
<xs:attribute
name=
"referencedColumnName"
type=
"xs:NMTOKEN"
use=
"required"
/>
</xs:complexType>
<xs:complexType
name=
"join-columns"
>
<xs:sequence>
<xs:element
name=
"join-column"
type=
"orm:join-column"
/>
</xs:sequence>
</xs:complexType>
<xs:complexType
name=
"join-table"
>
<xs:sequence>
<xs:element
name=
"join-columns"
type=
"orm:join-columns"
/>
<xs:element
name=
"inverse-join-columns"
type=
"orm:join-columns"
/>
</xs:sequence>
<xs:attribute
name=
"name"
type=
"xs:NMTOKEN"
use=
"required"
/>
</xs:complexType>
<xs:complexType
name=
"many-to-many"
>
<xs:sequence>
<xs:element
name=
"cascade"
type=
"orm:cascade-type"
minOccurs=
"0"
/>
<xs:element
name=
"join-table"
type=
"orm:join-table"
/>
</xs:sequence>
<xs:attribute
name=
"targetEntity"
type=
"xs:NMTOKEN"
use=
"required"
/>
<xs:attribute
name=
"field"
type=
"xs:NMTOKEN"
use=
"required"
/>
</xs:complexType>
<xs:complexType
name=
"one-to-many"
>
<xs:sequence>
<xs:element
name=
"cascade"
type=
"orm:cascade-type"
minOccurs=
"0"
/>
</xs:sequence>
<xs:attribute
name=
"targetEntity"
type=
"xs:NMTOKEN"
use=
"required"
/>
<xs:attribute
name=
"mappedBy"
type=
"xs:NMTOKEN"
/>
<xs:attribute
name=
"field"
type=
"xs:NMTOKEN"
use=
"required"
/>
</xs:complexType>
<xs:complexType
name=
"one-to-one"
>
<xs:sequence>
<xs:element
name=
"cascade"
type=
"orm:cascade-type"
minOccurs=
"0"
/>
<xs:choice
minOccurs=
"0"
maxOccurs=
"1"
>
<xs:element
name=
"join-column"
type=
"orm:join-column"
/>
<xs:element
name=
"join-columns"
type=
"orm:join-columns"
/>
</xs:choice>
</xs:sequence>
<xs:attribute
name=
"targetEntity"
type=
"xs:NMTOKEN"
use=
"required"
/>
<xs:attribute
name=
"mappedBy"
type=
"xs:NMTOKEN"
/>
<xs:attribute
name=
"field"
type=
"xs:NMTOKEN"
use=
"required"
/>
</xs:complexType>
</xs:schema>
\ No newline at end of file
lib/Doctrine/Common/ClassLoader.php
View file @
d90e71d0
...
...
@@ -59,7 +59,7 @@ class ClassLoader
}
/**
* Set
namespace separator
* Set
s the namespace separator to use.
*
* @param string $separator
* @return void
...
...
lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php
View file @
d90e71d0
...
...
@@ -66,12 +66,10 @@ class ClassMetadataFactory
public
function
setCacheDriver
(
$cacheDriver
)
{
$this
->
_cacheDriver
=
$cacheDriver
;
/*
foreach
(
$this
->
_driver
->
preload
()
as
$className
)
{
$cacheKey
=
"
$className
\$
CLASSMETADATA"
;
$this
->
_cacheDriver
->
save
(
$cacheKey
,
$this
->
getMetadataFor
(
$className
),
null
);
}
*/
}
/**
...
...
lib/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php
View file @
d90e71d0
...
...
@@ -61,12 +61,12 @@ class AnnotationDriver
));
}
// Evaluate
Doctrine
InheritanceType annotation
// Evaluate InheritanceType annotation
if
(
$inheritanceTypeAnnot
=
$annotClass
->
getAnnotation
(
'InheritanceType'
))
{
$metadata
->
setInheritanceType
(
$inheritanceTypeAnnot
->
value
);
}
// Evaluate D
octrineD
iscriminatorColumn annotation
// Evaluate DiscriminatorColumn annotation
if
(
$discrColumnAnnot
=
$annotClass
->
getAnnotation
(
'DiscriminatorColumn'
))
{
$metadata
->
setDiscriminatorColumn
(
array
(
'name'
=>
$discrColumnAnnot
->
name
,
...
...
@@ -75,7 +75,7 @@ class AnnotationDriver
));
}
// Evaluate D
octrineDiscriminatorMap
annotation
// Evaluate D
iscriminatorValue
annotation
if
(
$discrValueAnnot
=
$annotClass
->
getAnnotation
(
'DiscriminatorValue'
))
{
$metadata
->
setDiscriminatorValue
(
$discrValueAnnot
->
value
);
}
...
...
lib/Doctrine/ORM/Mapping/Driver/XmlDriver.php
0 → 100644
View file @
d90e71d0
<?php
/*
* $Id$
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the LGPL. For more information, see
* <http://www.doctrine-project.org>.
*/
namespace
Doctrine\ORM\Mapping\Driver
;
use
Doctrine\ORM\Mapping\ClassMetadata
;
use
Doctrine\ORM\Mapping\MappingException
;
/**
* XmlDriver is a metadata driver that enables mapping through XML files.
*
* @author Roman Borschel <roman@code-factory.org>
* @since 2.0
*/
class
XmlDriver
{
/**
* The FILE_PER_CLASS mode is an operating mode of the XmlDriver where it loads
* the mapping files of individual classes on demand. This requires the user to
* adhere to the convention of 1 mapping file per class and the file names of
* the mapping files must correspond to the full class name, including namespace,
* with the namespace delimiters '\', replaced by dots '.'.
*
* Example:
* Class: My\Project\Model\User
* Mapping file: My.Project.Model.User.dcm.xml
*
* @var integer
*/
const
FILE_PER_CLASS
=
1
;
/**
* The PRELOAD mode is an operating mode of the XmlDriver where it loads
* all mapping files in advance. This is the default behavior. It does not
* require a naming convention or the convention of 1 class per mapping file.
*
* @var integer
*/
const
PRELOAD
=
2
;
/** The paths where to look for mapping files. */
private
$_paths
;
/** The operating mode. Either FILE_PER_CLASS or PRELOAD. */
private
$_mode
;
/** The file extension of mapping documents. */
private
$_fileExtension
=
'.dcm.xml'
;
/** Any preloaded XML elements. */
private
$_xmlElements
=
array
();
/**
* Initializes a new XmlDriver that looks in the given path(s) for mapping
* documents and operates in the specified operating mode.
*
* @param string|array $paths One or multiple paths where mapping documents can be found.
* @param integer $mode The operating mode. Either PRELOAD (default) or FILE_PER_CLASS.
*/
public
function
__construct
(
$paths
,
$mode
=
self
::
PRELOAD
)
{
$this
->
_paths
=
$paths
;
$this
->
_mode
=
$mode
;
}
/**
* Gets any preloaded XML documents.
*
* @return array
*/
public
function
getPreloadedXmlElements
()
{
return
$this
->
_xmlElements
;
}
/**
* Loads the metadata for the specified class into the provided container.
*
* @param string $className
* @param ClassMetadata $metadata
*/
public
function
loadMetadataForClass
(
$className
,
ClassMetadata
$metadata
)
{
if
(
isset
(
$this
->
_xmlElements
[
$className
]))
{
$xmlRoot
=
$this
->
_xmlElements
[
$className
];
unset
(
$this
->
_xmlElements
[
$className
]);
}
else
{
$result
=
$this
->
_loadMappingFile
(
$this
->
_findMappingFile
(
$className
));
$xmlRoot
=
$result
[
$className
];
}
if
(
$xmlRoot
->
getName
()
==
'entity'
)
{
// Evaluate <entity...> attributes
if
(
isset
(
$xmlRoot
[
'table'
]))
{
$metadata
->
primaryTable
[
'name'
]
=
(
string
)
$xmlRoot
[
'table'
];
}
if
(
isset
(
$xmlRoot
[
'schema'
]))
{
$metadata
->
primaryTable
[
'schema'
]
=
(
string
)
$xmlRoot
[
'schema'
];
}
if
(
isset
(
$xmlRoot
[
'inheritance-type'
]))
{
$metadata
->
setInheritanceType
((
string
)
$xmlRoot
[
'inheritance-type'
]);
}
// Evaluate <field ...> mappings
if
(
isset
(
$xmlRoot
->
field
))
{
foreach
(
$xmlRoot
->
field
as
$fieldMapping
)
{
$mapping
=
array
(
'fieldName'
=>
(
string
)
$fieldMapping
[
'name'
],
'type'
=>
(
string
)
$fieldMapping
[
'type'
]
);
if
(
isset
(
$fieldMapping
[
'column'
]))
{
$mapping
[
'columnName'
]
=
(
string
)
$fieldMapping
[
'column'
];
}
if
(
isset
(
$fieldMapping
[
'length'
]))
{
$mapping
[
'length'
]
=
(
int
)
$fieldMapping
[
'length'
];
}
$metadata
->
mapField
(
$mapping
);
}
}
// Evaluate <id ...> mappings
foreach
(
$xmlRoot
->
id
as
$idElement
)
{
$mapping
=
array
(
'id'
=>
true
,
'fieldName'
=>
(
string
)
$idElement
[
'name'
],
'type'
=>
(
string
)
$idElement
[
'type'
]
);
if
(
isset
(
$idElement
[
'column'
]))
{
$mapping
[
'columnName'
]
=
(
string
)
$idElement
[
'column'
];
}
$metadata
->
mapField
(
$mapping
);
if
(
isset
(
$idElement
->
generator
))
{
$metadata
->
setIdGeneratorType
((
string
)
$idElement
->
generator
[
'strategy'
]);
}
}
// Evaluate <one-to-one ...> mappings
if
(
isset
(
$xmlRoot
->
{
'one-to-one'
}))
{
foreach
(
$xmlRoot
->
{
'one-to-one'
}
as
$oneToOneElement
)
{
$mapping
=
array
(
'fieldName'
=>
(
string
)
$oneToOneElement
[
'field'
],
'targetEntity'
=>
(
string
)
$oneToOneElement
[
'targetEntity'
]
);
if
(
isset
(
$oneToOneElement
[
'mappedBy'
]))
{
$mapping
[
'mappedBy'
]
=
(
string
)
$oneToOneElement
[
'mappedBy'
];
}
else
{
$joinColumns
=
array
();
if
(
isset
(
$oneToOneElement
->
{
'join-column'
}))
{
$joinColumns
[]
=
$this
->
_getJoinColumnMapping
(
$oneToOneElement
->
{
'join-column'
});
}
else
if
(
isset
(
$oneToOneElement
->
{
'join-columns'
}))
{
foreach
(
$oneToOneElement
->
{
'join-columns'
}
->
{
'join-column'
}
as
$joinColumnElement
)
{
$joinColumns
[]
=
$this
->
_getJoinColumnMapping
(
$joinColumnElement
);
}
}
else
{
throw
MappingException
::
invalidMapping
(
$mapping
[
'fieldName'
]);
}
$mapping
[
'joinColumns'
]
=
$joinColumns
;
}
if
(
isset
(
$oneToOneElement
->
cascade
))
{
$mapping
[
'cascade'
]
=
$this
->
_getCascadeMappings
(
$oneToOneElement
->
cascade
);
}
$metadata
->
mapOneToOne
(
$mapping
);
}
}
// Evaluate <one-to-many ...> mappings
if
(
isset
(
$xmlRoot
->
{
'one-to-many'
}))
{
foreach
(
$xmlRoot
->
{
'one-to-many'
}
as
$oneToManyElement
)
{
$mapping
=
array
(
'fieldName'
=>
(
string
)
$oneToManyElement
[
'field'
],
'targetEntity'
=>
(
string
)
$oneToManyElement
[
'targetEntity'
],
'mappedBy'
=>
(
string
)
$oneToManyElement
[
'mappedBy'
]
);
if
(
isset
(
$oneToManyElement
->
cascade
))
{
$mapping
[
'cascade'
]
=
$this
->
_getCascadeMappings
(
$oneToManyElement
->
cascade
);
}
$metadata
->
mapOneToMany
(
$mapping
);
}
}
// Evaluate <many-to-one ...> mappings
if
(
isset
(
$xmlRoot
->
{
'many-to-one'
}))
{
foreach
(
$xmlRoot
->
{
'many-to-one'
}
as
$manyToOneElement
)
{
$mapping
=
array
(
'fieldName'
=>
(
string
)
$manyToOneElement
[
'field'
],
'targetEntity'
=>
(
string
)
$manyToOneElement
[
'targetEntity'
]
);
$joinColumns
=
array
();
if
(
isset
(
$manyToOneElement
->
{
'join-column'
}))
{
$joinColumns
[]
=
$this
->
_getJoinColumnMapping
(
$manyToOneElement
->
{
'join-column'
});
}
else
if
(
isset
(
$manyToOneElement
->
{
'join-columns'
}))
{
foreach
(
$manyToOneElement
->
{
'join-columns'
}
->
{
'join-column'
}
as
$joinColumnElement
)
{
$joinColumns
[]
=
$this
->
_getJoinColumnMapping
(
$joinColumnElement
);
}
}
else
{
throw
MappingException
::
invalidMapping
(
$mapping
[
'fieldName'
]);
}
$mapping
[
'joinColumns'
]
=
$joinColumns
;
if
(
isset
(
$manyToOneElement
->
cascade
))
{
$mapping
[
'cascade'
]
=
$this
->
_getCascadeMappings
(
$manyToOneElement
->
cascade
);
}
$metadata
->
mapManyToOne
(
$mapping
);
}
}
// Evaluate <many-to-many ...> mappings
if
(
isset
(
$xmlRoot
->
{
'many-to-many'
}))
{
foreach
(
$xmlRoot
->
{
'many-to-many'
}
as
$manyToManyElement
)
{
$mapping
=
array
(
'fieldName'
=>
(
string
)
$manyToManyElement
[
'field'
],
'targetEntity'
=>
(
string
)
$manyToManyElement
[
'targetEntity'
]
);
if
(
isset
(
$manyToManyElement
[
'mappedBy'
]))
{
$mapping
[
'mappedBy'
]
=
(
string
)
$manyToManyElement
[
'mappedBy'
];
}
else
if
(
isset
(
$manyToManyElement
->
{
'join-table'
}))
{
$joinTableElement
=
$manyToManyElement
->
{
'join-table'
};
$joinTable
=
array
(
'name'
=>
(
string
)
$joinTableElement
[
'name'
]
);
if
(
isset
(
$joinTableElement
[
'schema'
]))
{
$joinTable
[
'schema'
]
=
(
string
)
$joinTableElement
[
'schema'
];
}
foreach
(
$joinTableElement
->
{
'join-columns'
}
->
{
'join-column'
}
as
$joinColumnElement
)
{
$joinTable
[
'joinColumns'
][]
=
$this
->
_getJoinColumnMapping
(
$joinColumnElement
);
}
foreach
(
$joinTableElement
->
{
'inverse-join-columns'
}
->
{
'join-column'
}
as
$joinColumnElement
)
{
$joinTable
[
'inverseJoinColumns'
][]
=
$this
->
_getJoinColumnMapping
(
$joinColumnElement
);
}
$mapping
[
'joinTable'
]
=
$joinTable
;
}
else
{
throw
MappingException
::
invalidMapping
(
$mapping
[
'fieldName'
]);
}
if
(
isset
(
$manyToManyElement
->
cascade
))
{
$mapping
[
'cascade'
]
=
$this
->
_getCascadeMappings
(
$manyToManyElement
->
cascade
);
}
$metadata
->
mapManyToMany
(
$mapping
);
}
}
}
else
if
(
$xmlRoot
->
getName
()
==
'mapped-superclass'
)
{
throw
MappingException
::
notImplemented
(
'Mapped superclasses are not yet supported.'
);
}
}
/**
* Whether the class with the specified name should have its metadata loaded.
* This is only the case if it is either mapped as an Entity or a
* MappedSuperclass.
*
* @param string $className
* @return boolean
*/
public
function
isTransient
(
$className
)
{
$isTransient
=
true
;
if
(
$this
->
_mode
==
self
::
FILE_PER_CLASS
)
{
// check whether file exists
foreach
((
array
)
$this
->
_paths
as
$path
)
{
if
(
file_exists
(
$path
.
DIRECTORY_SEPARATOR
.
str_replace
(
'\\'
,
'.'
,
$className
)
.
$this
->
_fileExtension
))
{
$isTransient
=
false
;
break
;
}
}
}
else
{
$isTransient
=
isset
(
$this
->
_xmlElements
[
$className
]);
}
return
$isTransient
;
}
/**
* Preloads all mapping information found in any documents within the
* configured paths and returns a list of class names that have been preloaded.
*
* @return array The list of class names that have been preloaded.
*/
public
function
preload
()
{
if
(
$this
->
_mode
!=
self
::
PRELOAD
)
{
return
array
();
}
foreach
((
array
)
$this
->
_paths
as
$path
)
{
if
(
is_dir
(
$path
))
{
$files
=
glob
(
$path
.
'/*'
.
$this
->
_fileExtension
);
foreach
(
$files
as
$file
)
{
$this
->
_xmlElements
=
array_merge
(
$this
->
_xmlElements
,
$this
->
_loadMappingFile
(
$file
));
}
}
else
if
(
is_file
(
$path
))
{
$this
->
_xmlElements
=
array_merge
(
$this
->
_xmlElements
,
$this
->
_loadMappingFile
(
$path
));
}
}
return
array_keys
(
$this
->
_xmlElements
);
}
/**
* Loads a mapping file with the given name and returns a map
* from class/entity names to their corresponding SimpleXMLElement nodes.
*
* @param string $file The mapping file to load.
* @return array
*/
private
function
_loadMappingFile
(
$file
)
{
$result
=
array
();
$xmlElement
=
simplexml_load_file
(
$file
);
if
(
isset
(
$xmlElement
->
entity
))
{
foreach
(
$xmlElement
->
entity
as
$entityElement
)
{
$entityName
=
(
string
)
$entityElement
[
'name'
];
$result
[
$entityName
]
=
$entityElement
;
}
}
else
if
(
isset
(
$xmlElement
->
{
'mapped-superclass'
}))
{
foreach
(
$xmlElement
->
{
'mapped-superclass'
}
as
$mapperSuperClass
)
{
$className
=
(
string
)
$mappedSuperClass
[
'name'
];
$result
[
$className
]
=
$mappedSuperClass
;
}
}
return
$result
;
}
/**
* Finds the mapping file for the class with the given name by searching
* through the configured paths.
*
* @param $className
* @return string The (absolute) file name.
* @throws MappingException
*/
private
function
_findMappingFile
(
$className
)
{
$fileName
=
null
;
foreach
((
array
)
$this
->
_paths
as
$path
)
{
$fileName
=
$path
.
DIRECTORY_SEPARATOR
.
str_replace
(
'\\'
,
'.'
,
$className
)
.
$this
->
_fileExtension
;
if
(
file_exists
(
$fileName
))
{
break
;
}
}
if
(
$fileName
===
null
)
{
throw
MappingException
::
mappingFileNotFound
(
$className
);
}
return
$fileName
;
}
/**
* Constructs a joinColumn mapping array based on the information
* found in the given SimpleXMLElement.
*
* @param $joinColumnElement The XML element.
* @return array The mapping array.
*/
private
function
_getJoinColumnMapping
(
\SimpleXMLElement
$joinColumnElement
)
{
$joinColumn
=
array
(
'name'
=>
(
string
)
$joinColumnElement
[
'name'
],
'referencedColumnName'
=>
(
string
)
$joinColumnElement
[
'referencedColumnName'
]
);
if
(
isset
(
$joinColumnElement
[
'unique'
]))
{
$joinColumn
[
'unique'
]
=
(
bool
)
$joinColumnElement
[
'unique'
];
}
if
(
isset
(
$joinColumnElement
[
'nullable'
]))
{
$joinColumn
[
'nullable'
]
=
(
bool
)
$joinColumnElement
[
'nullable'
];
}
if
(
isset
(
$joinColumnElement
[
'onDelete'
]))
{
$joinColumn
[
'onDelete'
]
=
(
string
)
$joinColumnElement
[
'onDelete'
];
}
if
(
isset
(
$joinColumnElement
[
'onUpdate'
]))
{
$joinColumn
[
'onUpdate'
]
=
(
string
)
$joinColumnElement
[
'onUpdate'
];
}
return
$joinColumn
;
}
/**
* Gathers a list of cascade options found in the given cascade element.
*
* @param $cascadeElement The cascade element.
* @return array The list of cascade options.
*/
private
function
_getCascadeMappings
(
$cascadeElement
)
{
$cascades
=
array
();
if
(
isset
(
$cascadeElement
->
{
'cascade-save'
}))
{
$cascades
[]
=
'save'
;
}
if
(
isset
(
$cascadeElement
->
{
'cascade-delete'
}))
{
$cascades
[]
=
'delete'
;
}
if
(
isset
(
$cascadeElement
->
{
'cascade-merge'
}))
{
$cascades
[]
=
'merge'
;
}
if
(
isset
(
$cascadeElement
->
{
'cascade-refresh'
}))
{
$cascades
[]
=
'refresh'
;
}
return
$cascades
;
}
}
lib/Doctrine/ORM/Mapping/OneToOneMapping.php
View file @
d90e71d0
...
...
@@ -89,7 +89,7 @@ class OneToOneMapping extends AssociationMapping
if
(
$this
->
isOwningSide
())
{
if
(
!
isset
(
$mapping
[
'joinColumns'
]))
{
throw
MappingException
::
invalidMapping
(
$this
->
_
sourceFieldName
);
throw
MappingException
::
invalidMapping
(
$this
->
sourceFieldName
);
}
$this
->
joinColumns
=
$mapping
[
'joinColumns'
];
foreach
(
$mapping
[
'joinColumns'
]
as
$joinColumn
)
{
...
...
tests/Doctrine/Tests/ORM/Mapping/AllTests.php
View file @
d90e71d0
...
...
@@ -20,6 +20,7 @@ class AllTests
$suite
=
new
\Doctrine\Tests\DoctrineTestSuite
(
'Doctrine Orm Mapping'
);
$suite
->
addTestSuite
(
'Doctrine\Tests\ORM\Mapping\ClassMetadataTest'
);
$suite
->
addTestSuite
(
'Doctrine\Tests\ORM\Mapping\XmlDriverTest'
);
//$suite->addTestSuite('Doctrine\Tests\ORM\Mapping\ClassMetadataFactoryTest');
return
$suite
;
...
...
tests/Doctrine/Tests/ORM/Mapping/XmlDriverTest.php
0 → 100644
View file @
d90e71d0
<?php
namespace
Doctrine\Tests\ORM\Mapping
;
use
Doctrine\ORM\Mapping\ClassMetadata
;
use
Doctrine\ORM\Mapping\Driver\XmlDriver
;
require_once
__DIR__
.
'/xml/User.php'
;
require_once
__DIR__
.
'/../../TestInit.php'
;
class
XmlDriverTest
extends
\Doctrine\Tests\OrmTestCase
{
public
function
testFilePerClassMapping
()
{
$className
=
'XmlMappingTest\User'
;
$xmlDriver
=
new
XmlDriver
(
__DIR__
.
DIRECTORY_SEPARATOR
.
'xml'
,
XmlDriver
::
FILE_PER_CLASS
);
$class
=
new
ClassMetadata
(
$className
);
$this
->
assertFalse
(
$xmlDriver
->
isTransient
(
$className
));
$xmlDriver
->
loadMetadataForClass
(
$className
,
$class
);
$this
->
assertEquals
(
'cms_users'
,
$class
->
getTableName
());
$this
->
assertEquals
(
ClassMetadata
::
INHERITANCE_TYPE_NONE
,
$class
->
getInheritanceType
());
$this
->
assertEquals
(
2
,
count
(
$class
->
fieldMappings
));
$this
->
assertTrue
(
isset
(
$class
->
fieldMappings
[
'id'
]));
$this
->
assertTrue
(
isset
(
$class
->
fieldMappings
[
'name'
]));
$this
->
assertEquals
(
'string'
,
$class
->
fieldMappings
[
'name'
][
'type'
]);
$this
->
assertEquals
(
array
(
'id'
),
$class
->
identifier
);
$this
->
assertEquals
(
ClassMetadata
::
GENERATOR_TYPE_AUTO
,
$class
->
getIdGeneratorType
());
$this
->
assertEquals
(
3
,
count
(
$class
->
associationMappings
));
$this
->
assertEquals
(
1
,
count
(
$class
->
inverseMappings
));
$this
->
assertTrue
(
$class
->
associationMappings
[
'address'
]
instanceof
\Doctrine\ORM\Mapping\OneToOneMapping
);
$this
->
assertTrue
(
isset
(
$class
->
associationMappings
[
'address'
]));
$this
->
assertTrue
(
$class
->
associationMappings
[
'address'
]
->
isOwningSide
);
$this
->
assertTrue
(
$class
->
associationMappings
[
'phonenumbers'
]
instanceof
\Doctrine\ORM\Mapping\OneToManyMapping
);
$this
->
assertTrue
(
isset
(
$class
->
associationMappings
[
'phonenumbers'
]));
$this
->
assertFalse
(
$class
->
associationMappings
[
'phonenumbers'
]
->
isOwningSide
);
$this
->
assertTrue
(
$class
->
associationMappings
[
'phonenumbers'
]
->
isInverseSide
());
$this
->
assertTrue
(
$class
->
associationMappings
[
'phonenumbers'
]
->
isCascadeSave
);
$this
->
assertTrue
(
$class
->
associationMappings
[
'groups'
]
instanceof
\Doctrine\ORM\Mapping\ManyToManyMapping
);
$this
->
assertTrue
(
isset
(
$class
->
associationMappings
[
'groups'
]));
$this
->
assertTrue
(
$class
->
associationMappings
[
'groups'
]
->
isOwningSide
);
}
public
function
testPreloadMode
()
{
$className
=
'XmlMappingTest\User'
;
$xmlDriver
=
new
XmlDriver
(
__DIR__
.
DIRECTORY_SEPARATOR
.
'xml'
);
$class
=
new
ClassMetadata
(
$className
);
$classNames
=
$xmlDriver
->
preload
();
$this
->
assertEquals
(
$className
,
$classNames
[
0
]);
$this
->
assertEquals
(
1
,
count
(
$xmlDriver
->
getPreloadedXmlElements
()));
$xmlDriver
->
loadMetadataForClass
(
$className
,
$class
);
$this
->
assertEquals
(
0
,
count
(
$xmlDriver
->
getPreloadedXmlElements
()));
}
}
\ No newline at end of file
tests/Doctrine/Tests/ORM/Mapping/xml/User.php
0 → 100644
View file @
d90e71d0
<?php
namespace
XmlMappingTest
;
class
User
{
private
$id
;
private
$name
;
private
$address
;
private
$phonenumbers
;
private
$groups
;
// ... rest of code omitted, irrelevant for the mapping test
}
tests/Doctrine/Tests/ORM/Mapping/xml/XmlMappingTest.User.dcm.xml
0 → 100644
View file @
d90e71d0
<?xml version="1.0" encoding="UTF-8"?>
<doctrine-mapping
xmlns=
"http://schemas.doctrine-project.org/orm/doctrine-mapping"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://schemas.doctrine-project.org/orm/doctrine-mapping
/Users/robo/dev/php/Doctrine/doctrine-mapping.xsd"
>
<entity
name=
"XmlMappingTest\User"
table=
"cms_users"
>
<id
name=
"id"
type=
"integer"
column=
"id"
>
<generator
strategy=
"auto"
/>
</id>
<field
name=
"name"
column=
"name"
type=
"string"
length=
"50"
/>
<one-to-one
field=
"address"
targetEntity=
"Address"
>
<join-column
name=
"address_id"
referencedColumnName=
"id"
/>
</one-to-one>
<one-to-many
field=
"phonenumbers"
targetEntity=
"Phonenumber"
mappedBy=
"user"
>
<cascade>
<cascade-save/>
</cascade>
</one-to-many>
<many-to-many
field=
"groups"
targetEntity=
"Group"
>
<join-table
name=
"cms_users_groups"
>
<join-columns>
<join-column
name=
"user_id"
referencedColumnName=
"id"
/>
</join-columns>
<inverse-join-columns>
<join-column
name=
"group_id"
referencedColumnName=
"id"
/>
</inverse-join-columns>
</join-table>
</many-to-many>
</entity>
</doctrine-mapping>
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment