Symfony 3.4动态调用仓库方法:数组参数转逗号分隔传参
解决Symfony 3.4中动态调用仓库方法的参数传递问题
在PHP里处理这种完全动态的方法调用场景,有两个非常实用的方案,完美适配你从YML配置获取方法名和参数数组的需求:
方案1:使用参数展开运算符(...)
如果你的项目运行的PHP版本是5.6及以上(Symfony 3.4最低要求是PHP 5.5.9,而5.6+已经是很普遍的版本了),可以直接用参数展开运算符把数组拆成逗号分隔的独立参数传入方法,代码简洁直观:
// 先获取对应的仓库实例 $repository = $this->em->getRepository($info['repoName']); // 动态调用方法,自动展开参数数组 $result = $repository->{$info['funcName']}(...$arr['params']);
这个运算符会自动把数组里的每个元素按顺序转换成独立参数,完全不需要关心参数的数量,刚好匹配你这种无法预知方法参数的动态场景。
方案2:使用call_user_func_array()函数
如果你的PHP版本低于5.6(虽然不太推荐,但也能兼容),可以用PHP内置的call_user_func_array()函数来实现参数的动态传递:
$repository = $this->em->getRepository($info['repoName']); $result = call_user_func_array([$repository, $info['funcName']], $arr['params']);
这个函数的第一个参数是一个数组,第一个元素是对象实例,第二个是要调用的方法名;第二个参数就是你的参数数组,它会自动把数组元素拆解成独立参数传入目标方法。
额外提醒
一定要确保$arr['params']数组的元素顺序和目标方法的参数顺序完全一致,否则会出现参数不匹配的错误(你已经提到参数数量一致,顺序这块也别忽略哦);另外如果目标方法有必填参数,要保证配置里的参数数组没有缺失,避免调用时报错。
内容的提问来源于stack exchange,提问作者Testas Testauskas
相关产品推荐
相关产品推荐

