Symfony中通过字符串调用实体方法报错,如何解决?
如何通过字符串调用Symfony实体的方法?
你遇到的这个错误是因为把方法调用的完整语句当成了属性名来访问啦!咱们先还原下你的问题场景:
Notice: Undefined property: AppBundle\Entity\User::$setName
你的控制器代码里,把方法名和参数拼成了"setName(".$value.")"这样的字符串,然后试图用$user->$method或者eval去执行——这其实是在找User实体里名为setName(Peter)的属性,而不是调用setName方法,自然会报错找不到这个属性。
正确的实现方式
其实不用搞这么复杂,拆分方法名和参数就行:
方法1:直接动态调用方法
这是最简单的方式,把方法名单独存成字符串,然后直接传参数调用:
$user = $this->getDoctrine()->getRepository("AppBundle:User")->find(1); $value = "Peter"; $methodName = "setName"; // 直接通过变量调用方法并传参 $user->$methodName($value);
方法2:使用call_user_func
如果需要更灵活的调用形式,可以用这个函数:
$user = $this->getDoctrine()->getRepository("AppBundle:User")->find(1); $value = "Peter"; $methodName = "setName"; call_user_func([$user, $methodName], $value);
方法3:多参数场景用call_user_func_array
如果你的方法需要多个参数,把参数放进数组里即可:
$user = $this->getDoctrine()->getRepository("AppBundle:User")->find(1); $params = ["Peter", 30]; // 假设是setNameAndAge方法的两个参数 $methodName = "setNameAndAge"; call_user_func_array([$user, $methodName], $params);
另外提醒一句,尽量不要用eval,它不仅存在安全风险,而且在这个场景下完全没必要,反而容易引入各种不可控的问题。
内容的提问来源于stack exchange,提问作者Teshan N.
相关产品推荐
相关产品推荐

