Symfony API Platform调用setServerID报参数类型错误
问题描述
执行自定义控制器逻辑新增Commands实体数据时,抛出如下类型错误:
App\Entity\Commands::setServerID(): Argument #1 ($serverID) must be of type ?App\Entity\Servers, string given
- 通过API Platform原生接口新增数据时功能运行正常


- 通过Postman请求自定义控制器、或直接在自定义控制器中编写新增逻辑时,就会触发上述报错,对应代码片段如下:
$commandDB = new Commands(); $commandDB->setCommand($command); $commandDB->setStatusCode(1); $commandDB->setOutput("added to DB"); $commandDB->setCreatedAt($date); $commandDB->setServerID($serverid);
根因判断:API Platform内置IRI自动转换机制,可自动将
/api/servers/1格式的资源标识符转换为对应的Servers实体对象;但自定义控制器默认不携带该转换能力,直接将字符串格式的ID/IRI传入了要求接收?Servers类型参数的setter方法,最终触发类型不匹配错误。
解决方案
- 手动查询关联实体传入
这是最通用的实现方式,调用setter前先通过Doctrine根据传入的server主键ID查询出对应的Servers实体,再传入方法即可。如果传入的是IRI格式字符串,先截取字符串拿到末尾的数字主键再查询,示例代码:// 提前通过依赖注入获取Doctrine的EntityManagerInterface $em // 若$serverid是IRI格式,先解析得到数字ID,例如intval(basename($serverid)) $server = $em->getRepository(Servers::class)->find($serverid); if (!$server) { throw $this->createNotFoundException('指定的服务器资源不存在'); } $commandDB->setServerID($server); - 复用API Platform的IRI转换组件
如果传入的$serverid本身就是标准IRI字符串,可以直接注入API Platform内置的IriConverterInterface服务,一行代码即可完成IRI到实体的转换,无需手动解析字符串或查询数据库,示例代码:// 提前通过依赖注入注入\ApiPlatform\Api\IriConverterInterface $iriConverter $server = $iriConverter->getResourceFromIri($serverid); $commandDB->setServerID($server); - Postman请求自定义接口适配
如果是通过Postman直接请求自定义控制器接口,请求体中关联字段的传值格式和API Platform原生接口保持一致,传入IRI格式字符串即可,同时可给自定义控制器开启Symfony参数转换器、或API Platform的DTO自动解析能力,实现和原生接口一致的自动转换效果。
内容的提问来源于stack exchange,提问作者Vortex666
相关产品推荐
相关产品推荐

