如何定位代码中Doctrine MappingException的抛出位置?
问题分析
你遇到的MappingException提示找不到Client类,但当前的错误日志堆栈被截断了,没法直接定位到代码里到底哪一步触发了这个问题。先看你贴的报错信息:
[29-Mar-2019 22:30:26 Europe/Moscow] PHP Fatal error: Uncaught Doctrine\Common\Persistence\Mapping\MappingException: Class 'Client' does not exist in /var/www/virtual/account/htdocs/vendor/doctrine/persistence/lib/Doctrine/Common/Persistence/Mapping/MappingException.php:93
Stack trace:
#0 /var/www/virtual/account/htdocs/vendor/doctrine/persistence/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php(24): Doctrine\Common\Persistence\Mapping\MappingException::nonExistingClass('Client')
#1 /var/www/virtual/account/htdocs/vendor/doctrine/persistence/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php(251): Doctrine\Common\Persistence\Mapping\RuntimeReflectionService->getParentClasses('Client')
#2 /var/www/virtual/account/htdocs/vendor/doctrine/persistence/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php(284): Doctrine\Common\Persistence\Mapping\AbstractClassMetadataFactory->getParentClasses('Client')
#3 /var/www/virtual/account/htdocs/vendor/doctrine/orm/lib/Doc in /var/www/virtual/account/htdocs/vendor/doctrine/persistence/lib/Doctrine/Common/Persistence/Mapping/MappingException.php on line 93
关于你写的那段try-catch代码:它没法帮你拿到更完整的堆栈,因为问题出在PHP的日志长度限制上,不是捕获方式的问题。你用$e->getTraceAsString()获取的堆栈同样会被PHP的log_errors_max_len参数截断,最终得到的结果和现在的报错日志是一样的。
解决方案
后来你也找到了问题根源:这不是Doctrine的问题,是PHP默认配置里log_errors_max_len默认值为1024字节,超过这个长度的堆栈就会被截断。只需要在代码里添加一行配置,允许无限长度的错误日志:
ini_set('log_errors_max_len', 0); // 0代表不限制日志内容长度
设置之后,再触发异常就能拿到完整的堆栈跟踪,这样就能定位到代码里到底是哪一处引用了不存在的Client类了。
内容的提问来源于stack exchange,提问作者Andrey Lebedev

