Files
2025-08-14 22:41:49 +02:00

107 lines
3.4 KiB
PHP

<?php
namespace Gedmo\Mapping\Driver;
use Gedmo\Mapping\Driver;
use Gedmo\Exception\InvalidMappingException;
use SimpleXMLElement;
/**
* The mapping XmlDriver abstract class, defines the
* metadata extraction function common among all
* all drivers used on these extensions by file based
* drivers.
*
* @author Miha Vrhovnik <miha.vrhovnik@gmail.com>
* @author Gediminas Morkevicius <gediminas.morkevicius@gmail.com>
* @license MIT License (http://www.opensource.org/licenses/mit-license.php)
*/
abstract class Xml extends File
{
const GEDMO_NAMESPACE_URI = 'http://gediminasm.org/schemas/orm/doctrine-extensions-mapping';
const DOCTRINE_NAMESPACE_URI = 'http://doctrine-project.org/schemas/orm/doctrine-mapping';
/**
* File extension
* @var string
*/
protected $_extension = '.dcm.xml';
/**
* Get attribute value.
* As we are supporting namespaces the only way to get to the attributes under a node is to use attributes function on it
*
* @param SimpleXMLElement $node
* @param string $attributeName
*
* @return string
*/
protected function _getAttribute(SimpleXmlElement $node, $attributeName)
{
$attributes = $node->attributes();
return (string) $attributes[$attributeName];
}
/**
* Get boolean attribute value.
* As we are supporting namespaces the only way to get to the attributes under a node is to use attributes function on it
*
* @param SimpleXMLElement $node
* @param string $attributeName
*
* @return boolean
*/
protected function _getBooleanAttribute(SimpleXmlElement $node, $attributeName)
{
$rawValue = strtolower($this->_getAttribute($node, $attributeName));
if ($rawValue === '1' || $rawValue === 'true') {
return true;
}
if ($rawValue === '0' || $rawValue === 'false') {
return false;
}
throw new InvalidMappingException(sprintf("Attribute %s must have a valid boolean value, '%s' found", $attributeName, $this->_getAttribute($node, $attributeName)));
}
/**
* does attribute exist under a specific node
* As we are supporting namespaces the only way to get to the attributes under a node is to use attributes function on it
*
* @param SimpleXMLElement $node
* @param string $attributeName
*
* @return string
*/
protected function _isAttributeSet(SimpleXmlElement $node, $attributeName)
{
$attributes = $node->attributes();
return isset($attributes[$attributeName]);
}
/**
* {@inheritDoc}
*/
protected function _loadMappingFile($file)
{
$result = array();
$xmlElement = simplexml_load_file($file);
$xmlElement = $xmlElement->children(self::DOCTRINE_NAMESPACE_URI);
if (isset($xmlElement->entity)) {
foreach ($xmlElement->entity as $entityElement) {
$entityName = $this->_getAttribute($entityElement, 'name');
$result[$entityName] = $entityElement;
}
} elseif (isset($xmlElement->{'mapped-superclass'})) {
foreach ($xmlElement->{'mapped-superclass'} as $mappedSuperClass) {
$className = $this->_getAttribute($mappedSuperClass, 'name');
$result[$className] = $mappedSuperClass;
}
}
return $result;
}
}