{"record":{"id":"230c0248d9d395ff","repo":"doctrine/orm","slug":"the-class-s-is-not-part-of-the-proxy-namespace","errorCode":null,"errorMessage":"The class \"%s\" is not part of the proxy namespace \"%s\"","messagePattern":"The class \"(.+?)\" is not part of the proxy namespace \"(.+?)\"","errorType":"exception","errorClass":"NotAProxyClass","httpStatus":null,"severity":"error","filePath":"src/Proxy/Autoloader.php","lineNumber":49,"sourceCode":"     * 3. Return PHP filename from proxy-dir with the result from 2.\n     *\n     * @phpstan-param class-string $className\n     *\n     * @throws NotAProxyClass\n     */\n    public static function resolveFile(string $proxyDir, string $proxyNamespace, string $className): string\n    {\n        if (PHP_VERSION_ID >= 80400) {\n            Deprecation::trigger(\n                'doctrine/orm',\n                'https://github.com/doctrine/orm/pull/12005',\n                'Class \"%s\" is deprecated. Use native lazy objects instead.',\n                self::class,\n            );\n        }\n\n        if (! str_starts_with($className, $proxyNamespace)) {\n            throw new NotAProxyClass($className, $proxyNamespace);\n        }\n\n        // remove proxy namespace from class name\n        $classNameRelativeToProxyNamespace = substr($className, strlen($proxyNamespace));\n\n        // remove namespace separators from remaining class name\n        $fileName = str_replace('\\\\', '', $classNameRelativeToProxyNamespace);\n\n        return $proxyDir . DIRECTORY_SEPARATOR . $fileName . '.php';\n    }\n\n    /**\n     * Registers and returns autoloader callback for the given proxy dir and namespace.\n     *\n     * @param Closure(string, string, class-string): void|null $notFoundCallback Invoked when the proxy file is not found.\n     *\n     * @return Closure(string): void\n     */","sourceCodeStart":31,"sourceCodeEnd":67,"githubUrl":"https://github.com/doctrine/orm/blob/d9b9ff73016bf598ae07515f97289ce8074e97a5/src/Proxy/Autoloader.php#L31-L67","documentation":"Autoloader::resolveFile() maps a proxy class name to a file under the proxy directory by stripping the proxy namespace prefix. The SPL autoloader registered by Autoloader::register() skips any class not starting with the proxy namespace, so this InvalidArgumentException (NotAProxyClass) escapes when resolveFile() is called directly — e.g., by cache warmers, preloading or proxy-generating tooling — with a class outside the configured proxy namespace, or when the proxy namespace in Configuration does not prefix the class being resolved.","triggerScenarios":"Calling Autoloader::resolveFile($proxyDir, $proxyNamespace, $className) with an entity FQCN or any class not under the proxy namespace; proxy namespace misconfiguration (default 'Proxies', changed via Configuration::setProxyNamespace) so generated proxies no longer share the prefix; on PHP >= 8.4 the whole autoloader path is deprecated in favor of native lazy objects.","commonSituations":"Custom console commands / deployment scripts iterating classes and resolving proxy file paths; changing the proxy namespace but keeping stale generated proxy files; tooling calling resolveFile for arbitrary classes during cache warming.","solutions":["Guard the call: if (! str_starts_with($className, $proxyNamespace)) skip — resolve only proxy namespaced classes","Verify Configuration proxy settings: getProxyDir()/getProxyNamespace() match the proxies you actually generate","Regenerate proxies (doctrine orm:generate-proxies / cache:clear) after namespace changes","On PHP >= 8.4, switch to native lazy objects; the Autoloader is deprecated (PR 12005)"],"exampleFix":"// before\n$file = Autoloader::resolveFile($proxyDir, $proxyNamespace, $className); // throws for non-proxy classes\n\n// after\nif (str_starts_with($className, $proxyNamespace)) {\n    $file = Autoloader::resolveFile($proxyDir, $proxyNamespace, $className);\n}","handlingStrategy":"validation","validationCode":"if (str_starts_with($className, $proxyNamespace)) {\n    $file = Autoloader::resolveFile($proxyDir, $proxyNamespace, $className);\n}","typeGuard":"function isProxyClassName(string $className, string $proxyNamespace): bool\n{\n    return $proxyNamespace !== '' && str_starts_with($className, $proxyNamespace);\n}","tryCatchPattern":"try { $file = Autoloader::resolveFile($dir, $ns, $class); } catch (NotAProxyClass) { /* not a proxy: fall through to normal class handling */ }","preventionTips":["Only feed proxy-namespaced classes to resolveFile()","Keep Configuration proxy dir/namespace in sync with generated proxies","Migrate to native lazy objects on PHP >= 8.4; the autoloader is deprecated"],"tags":["proxy","autoloader","namespace","lazy-loading"],"backgroundTag":"proxy-namespace-mismatch","analyzedSha":"d9b9ff73016bf598ae07515f97289ce8074e97a5","analyzedAt":"2026-08-21T06:13:15.863Z","schemaVersion":2},"datasetVersion":"2026-08-21T11:28:35.574Z"}