Symfony3.4下HwiOauth/FOSUserBundle生产环境Doctrine代理文件缺失报错求助
嘿,折腾7天确实够闹心的——你遇到的这个生产环境Doctrine代理类找不到的问题,在Symfony 3.4搭配HwiOauthBundle和FOSUserBundle的场景里其实挺常见的,开发环境正常、生产环境炸锅,核心就是缓存和代理类生成的事儿,我给你捋几个靠谱的解决步骤:
1. 先强制重构生产环境的缓存和代理类
生产环境下Symfony不会自动生成Doctrine的代理类,必须手动触发。登录到生产服务器,执行这两条命令(一定要确保权限够,比如用web服务器的用户身份跑,或者给var目录开对权限):
# 先把旧缓存清干净 php bin/console cache:clear --env=prod --no-warmup # 预热缓存,顺便把Doctrine需要的代理类都生成出来 php bin/console cache:warmup --env=prod
划重点:var/cache/prod/doctrine/orm/Proxies这个目录必须让web服务器用户(比如www-data)能读写,不然生成代理类的时候会悄悄失败,回头还是报找不到文件。
2. 检查生产环境的Doctrine代理配置
打开app/config/config_prod.yml,确认Doctrine的代理类配置是不是下面这样:
doctrine: orm: auto_generate_proxy_classes: false proxy_dir: '%kernel.cache_dir%/doctrine/orm/Proxies' proxy_namespace: 'Proxies'
生产环境里auto_generate_proxy_classes必须设为false,但前提是你已经通过cache:warmup生成了所有需要的代理类。要是之前误设成true,反而会导致生产环境的代理类生成逻辑乱掉。
3. 排查实体关联和映射问题
你说这是集成Facebook登录时出的问题,大概率是登录流程里调用了用户实体关联的Image实体,但这个实体的代理类没生成。可以做这两个检查:
- 你的用户实体(继承FOSUser的
User类)是不是和Image实体有关联?比如有个$image属性,用了@ORM\OneToOne或者@ORM\ManyToOne注解。 - HwiOauth的登录逻辑里,是不是会自动加载用户的关联实体?比如获取Facebook返回的用户信息后,代码里有没有调用
$user->getImage()这类方法,触发Doctrine加载代理类。
要是不确定实体映射有没有问题,跑个命令看看Doctrine能不能识别到Image实体:
php bin/console doctrine:mapping:info --env=prod
如果ECUserBundle:Image没出现在输出列表里,那就是实体的注解或者配置文件写错了,得先把映射问题搞定。
4. 检查你的部署流程
很多时候这种问题是部署时的操作坑:
- 是不是直接把开发环境的
var/cache目录传到生产环境了?绝对不能这么干!生产环境的缓存必须在服务器本地生成,因为不同环境的路径、配置都不一样。 - 部署完成后有没有跳过缓存预热步骤?生产环境部署完一定要跑
cache:warmup,不然代理类、路由缓存这些都没生成,肯定出问题。
5. 临时调试(仅限排查用,别长期开)
要是上面的步骤都没解决,你可以临时在生产环境开一下代理类自动生成(排查完立刻改回去),在app/config/config_prod.yml里改:
doctrine: orm: auto_generate_proxy_classes: true
然后清空缓存再测试,如果问题消失了,那百分百就是代理类没生成的问题,改回false再重新预热缓存就行。
内容的提问来源于stack exchange,提问作者EmmCall

