doctrine/orm · error · LogicException

XSD validation cannot be enabled because the DOM extension…

Error message

XSD validation cannot be enabled because the DOM extension is missing.

What it means

XmlDriver optionally validates every .dcm.xml file against Doctrine's XSD schema ($isXsdValidationEnabled, true by default). XSD validation is done with the DOM extension, so when validation is requested but ext-dom is missing the constructor throws a LogicException instead of silently shipping unvalidated mappings.

Solutions

  1. Install/enable ext-dom: docker-php-ext-install dom, apt install php-xml, or apk add php83-dom, then restart PHP.
  2. If DOM is unavailable and you accept skipping validation, pass false explicitly: new XmlDriver($locator, XmlDriver::DEFAULT_FILE_EXTENSION, false).
  3. Keep validation enabled in CI (where you control the image) and only disable it in constrained runtimes.

Example fix

// before
$driver = new XmlDriver($configPaths); // LogicException: DOM extension missing

// after (option 1: disable validation)
$driver = new XmlDriver($configPaths, XmlDriver::DEFAULT_FILE_EXTENSION, false);
// after (option 2: fix the runtime)
//   docker-php-ext-install dom  && restart PHP
Defensive patterns

Strategy: validation

Validate before calling

$xsd = extension_loaded('dom'); // expensive envs may skip validation
$driver = new XmlDriver($locator, XmlDriver::DEFAULT_FILE_EXTENSION, $xsd);

Prevention

When it happens

Trigger: new XmlDriver($locator) (default third argument true) or explicitly new XmlDriver($locator, '.dcm.xml', true) on a PHP build where ext-dom is not loaded — usually the same minimal images that also lack simplexml.

Common situations: Minimal Docker/alpine PHP images where xml/dom packages are not installed; production servers provisioned without php-xml; enabling XSD validation deliberately in CI to catch malformed mapping files.

Related errors


AI-assisted analysis of doctrine/orm@d9b9ff7301 (2026-08-21). Data as JSON: /api/errors/0a2099f1a8e1d704. Report an issue: GitHub.

Appendix: source

Thrown at src/Mapping/Driver/XmlDriver.php:64

    public const DEFAULT_FILE_EXTENSION = '.dcm.xml';

    /**
     * {@inheritDoc}
     */
    public function __construct(
        string|array|FileLocator $locator,
        string $fileExtension = self::DEFAULT_FILE_EXTENSION,
        private readonly bool $isXsdValidationEnabled = true,
    ) {
        if (! extension_loaded('simplexml')) {
            throw new LogicException(
                'The XML metadata driver cannot be enabled because the SimpleXML PHP extension is missing.'
                . ' Please configure PHP with SimpleXML or choose a different metadata driver.',
            );
        }

        if ($isXsdValidationEnabled && ! extension_loaded('dom')) {
            throw new LogicException(
                'XSD validation cannot be enabled because the DOM extension is missing.',
            );
        }

        parent::__construct($locator, $fileExtension);
    }

    /**
     * {@inheritDoc}
     *
     * @param class-string<T>  $className
     * @param ClassMetadata<T> $metadata
     *
     * @template T of object
     */
    public function loadMetadataForClass($className, PersistenceClassMetadata $metadata): void
    {
        $xmlRoot = $this->getElement($className);

View on GitHub (pinned to d9b9ff7301)