{"record":{"id":"309e0d90b1fbff0a","repo":"doctrine/orm","slug":"argument-2-passed-to-s-must-be-an-instance-of","errorCode":null,"errorMessage":"Argument #2 passed to %s() must be an instance of %s, %s given.","messagePattern":"Argument #2 passed to (.+?)\\(\\) must be an instance of (.+?), (.+?) given\\.","errorType":"exception","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"src/Mapping/Driver/DatabaseDriver.php","lineNumber":175,"sourceCode":"    }\n\n    public function setInflector(Inflector $inflector): void\n    {\n        $this->inflector = $inflector;\n    }\n\n    /**\n     * {@inheritDoc}\n     *\n     * @param class-string<T>  $className\n     * @param ClassMetadata<T> $metadata\n     *\n     * @template T of object\n     */\n    public function loadMetadataForClass(string $className, PersistenceClassMetadata $metadata): void\n    {\n        if (! $metadata instanceof ClassMetadata) {\n            throw new TypeError(sprintf(\n                'Argument #2 passed to %s() must be an instance of %s, %s given.',\n                __METHOD__,\n                ClassMetadata::class,\n                get_debug_type($metadata),\n            ));\n        }\n\n        $this->reverseEngineerMappingFromDatabase();\n\n        if (! isset($this->classToTableNames[$className])) {\n            throw new InvalidArgumentException('Unknown class ' . $className);\n        }\n\n        $tableName = $this->classToTableNames[$className];\n\n        $metadata->name          = $className;\n        $metadata->table['name'] = $tableName;\n","sourceCodeStart":157,"sourceCodeEnd":193,"githubUrl":"https://github.com/doctrine/orm/blob/d9b9ff73016bf598ae07515f97289ce8074e97a5/src/Mapping/Driver/DatabaseDriver.php#L157-L193","documentation":"DatabaseDriver (Doctrine's schema-to-entities reverse-engineering driver) implements the shared persistence MappingDriver interface, whose loadMetadataForClass() accepts any PersistenceClassMetadata. The ORM implementation requires Doctrine\\ORM\\Mapping\\ClassMetadata specifically and throws a TypeError naming the method, the expected class and the actual type otherwise.","triggerScenarios":"Calling $databaseDriver->loadMetadataForClass($className, $metadata) with a $metadata that is not Doctrine\\ORM\\Mapping\\ClassMetadata — for example a ClassMetadata object from Doctrine ODM (MongoDB), Doctrine PHPCR, or a custom PersistenceClassMetadata implementation.","commonSituations":"Sharing drivers or metadata factories between persistence libraries (ORM + ODM in one project, common in Symfony with multiple doctrine connections/managers); custom tooling typed against the shared persistence interface instead of the ORM class.","solutions":["Pass an ORM ClassMetadata: new ClassMetadata($className), or fetch one from the EntityManager's metadata factory.","Type-hint your calling code against Doctrine\\ORM\\Mapping\\ClassMetadata so the mismatch is caught statically by PHPStan/IDE.","If you need a driver usable with another persistence library, that library needs its own driver implementation — DatabaseDriver is ORM-only."],"exampleFix":"// before\nuse Doctrine\\Persistence\\Mapping\\ClassMetadata as PersistenceClassMetadata;\n$driver->loadMetadataForClass($class, $odmMetadata); // TypeError\n\n// after\nuse Doctrine\\ORM\\Mapping\\ClassMetadata;\n$driver->loadMetadataForClass($class, new ClassMetadata($class));","handlingStrategy":"type-guard","validationCode":null,"typeGuard":"if (! $metadata instanceof \\Doctrine\\ORM\\Mapping\\ClassMetadata) {\n    throw new InvalidArgumentException('ORM DatabaseDriver requires ORM ClassMetadata, got ' . get_debug_type($metadata));\n}","tryCatchPattern":null,"preventionTips":["Type-hint call sites with the ORM-specific ClassMetadata, not the persistence interface.","Keep separate drivers per persistence library; do not share a DatabaseDriver across managers.","Let PHPStan verify the generic template T of object binds to your entity class."],"tags":["doctrine-orm","database-driver","reverse-engineering","type-error"],"backgroundTag":"wrong-argument-type","analyzedSha":"d9b9ff73016bf598ae07515f97289ce8074e97a5","analyzedAt":"2026-08-21T06:13:15.863Z","schemaVersion":2},"datasetVersion":"2026-08-21T11:28:35.574Z"}