重写FOSUser后,如何通过非仓库方式提取用户属性nom、prenom?
解决FOSUser扩展User类属性读取问题及替代提取方法
嘿,我来帮你捋捋这个问题!首先,你遇到的usr.nom为空但持久化正常的情况,大概率是实体映射或者getter方法的问题——毕竟数据能存进数据库,说明ORM映射的持久化配置是对的,但读取时拿不到,十有八九是读取环节没处理好。不过先不说排查原因,先回答你要的「除了实体仓库之外的提取属性方法」:
1. 直接调用对象的Getter方法(最推荐)
既然你的User类继承了FOSUser的BaseUser,又新增了nom和prenom字段,只要你正确生成了对应的getNom()和getPrenom()方法,不管是在控制器还是Twig视图里,都能直接调用获取值:
控制器示例:
// 获取当前登录用户 $user = $this->getUser(); // 直接调用getter $nom = $user->getNom(); $prenom = $user->getPrenom();
Twig视图示例:
Nom: {{ app.user.nom }} {# Twig会自动调用getNom()方法 #} Prenom: {{ app.user.prenom }} Username: {{ app.user.username }}
⚠️ 这里要注意:如果你的getter方法拼写错误(比如属性$nom对应getNom(),别搞混大小写),或者根本没生成getter,就会返回空值,先检查这个!
2. 用Symfony的PropertyAccessor组件动态获取
这是Symfony自带的工具,能通过属性名直接访问对象属性,适合动态获取属性的场景(比如属性名是变量的时候):
use Symfony\Component\PropertyAccess\PropertyAccessorInterface; // 通过依赖注入获取PropertyAccessor public function someAction(PropertyAccessorInterface $propertyAccessor) { $user = $this->getUser(); // 直接通过属性名取值 $nom = $propertyAccessor->getValue($user, 'nom'); $prenom = $propertyAccessor->getValue($user, 'prenom'); }
3. Twig直接访问公共属性(不推荐)
如果你的$nom和$prenom是public修饰的(虽然不符合面向对象封装原则,但万一你是这么写的),可以在Twig里直接访问:
Nom: {{ app.user.nom }}
⚠️ 强烈建议用getter方法,遵循封装规范,避免后续维护问题。
4. 用Doctrine的ArrayHydrator转成数组提取
如果你能拿到User的Query对象,可以用ArrayHydrator把实体转换成数组,然后直接取键值:
use Doctrine\ORM\Query; $entityManager = $this->getDoctrine()->getManager(); $query = $entityManager->createQuery('SELECT u FROM App\Entity\User u WHERE u.id = :id') ->setParameter('id', $userId); // 把结果转成数组 $userArray = $query->getResult(Query::HYDRATE_ARRAY)[0]; $nom = $userArray['nom']; $prenom = $userArray['prenom'];
这个方法适合批量处理数据的场景,本质是把实体对象转成数组结构来读取。
顺带排查你的usr.nom为空问题
既然数据能正常持久化,那大概率是这几个原因:
- Getter方法错误:检查User类里是否有正确的
getNom()和getPrenom(),方法名要符合Symfony的规范; - 缓存问题:Symfony的Doctrine元数据缓存或者Twig缓存可能没更新,试试运行
php bin/console cache:clear,尤其是生产环境; - 实体映射遗漏:虽然能持久化,但万一你的映射文件(注解/XML/YAML)里漏写了
nom和prenom的读取配置?不过这个可能性很低,因为持久化正常的话映射应该是对的。
内容的提问来源于stack exchange,提问作者TheNorth
相关产品推荐
相关产品推荐

