API平台Symfony,使用sarbacane发送sms时无法验证布尔类型的值

API平台Symfony,使用sarbacane发送sms时无法验证布尔类型的值,symfony,api-platform.com,Symfony,Api Platform.com,我创建了一个使用symfony和sarbacane发送sms的自定义操作: 在我的AppUser实体中,我添加了注释: * "GET", * "PUT", * "PATCH", * "DELETE", * "send_sms"={ * "method"

我创建了一个使用symfony和sarbacane发送sms的自定义操作:

在我的
AppUser
实体中,我添加了注释:

 *          "GET",
 *          "PUT",
 *          "PATCH",
 *          "DELETE",
 *          "send_sms"={
 *              "method"="POST",
 *              "path"="/app_users/{id}/sms",
 *              "controller"=SmsController::class,
 *              "normalization_context"={"groups"={"user:read"}},
 *              "put"={"validation_groups"={"Default", "sedValidation"}}
 *          }
 *    }
在我的控制器中,我实现了invoke方法:

public function\u调用(AppUser$user,Request$Request,SerializerInterface$serializer):bool
{
$data=$request->getContent();
//默认情况下,json解码转换为对象
//加真
$json_encode=json_decode($data,true);
$content=$json_encode['content'];
$currentUser=$this->getUser();
$currentUserPhone=$currentUser->getPhone();
$res=$this->sarbacaneApiHelper->call('campaigns/sms')[
'name'=>sprintf(“扩展n°%s”,uniqid()),
“种类”=>“短信通知”,
'smsFrom'=>“扩展”//entre 3 et 11 caractères alpha numériques
'content'=>$content,//最大450克拉
]);
$phone=$currentUserPhone;
$sarbacaneCampaignId=$res->id;
//萨尔巴坎坎帕涅酒店
$res=$this->sarbacaneApiHelper->call(sprintf('campetings/%s/recipients',$sarbacaneacampaignid)[
[
'phone'=>$phone,
],
]);
$params=[
“电话”=>$currentUserPhone,
];
$this->sarbacaneApiHelper->call(sprintf('campetings/%s/send',$sarbacaneacampaignid),$params);
$sent=true;
退回$sent;
}
我使用postman测试了api,得到了500个内部服务器错误:

“hydra:说明”:“无法自动验证“布尔”类型的值。请提供约束。”


为什么会出现此错误消息?

invoke()
方法:

  • 一个
    Symfony\Component\HttpFoundation\ResponseResponse
    实例
  • 目标实体的一个实例(在本例中似乎是
    AppUser
在您的情况下,该方法返回
true
;由于验证紧跟在控制器之后,Api平台尝试验证此布尔值,但这是不可能的。它需要一个实体

关于问题中显示的代码

我仍然很不清楚你想要实现什么:

  • 为什么从不使用
    $user
    arg
  • 发送电子邮件后是否要保存任何实体
  • 为什么要获取
    请求
    内容

由于调用
invoke()
方法的第一个参数是
$user
而不是
$data
,因此它应该抛出一个错误。我不明白为什么不。我不知道
发送\u sms
自定义操作中的
“put”
键是什么。最后您要声明一个POST操作,这意味着永远不会调用
ReadListener
,因此
{id}
参数是无用的。谢谢您的回答,您能解释一下数据应该是什么吗?我应该注入什么类来使用数据,以及如何在不传递id的情况下正确地将自定义操作添加到另一个路由?谢谢,我创建了一个新的sms实体,并返回了一个sms对象,我有一个问题,可以将类公开为api资源吗?只有一个类不是实体,我试图在我的src中创建一个目录,名为ApireSource的目录,我创建了一个类,并添加了注释,使这个类成为api ressource,但我在api平台的文档中看不到该类,我能做什么?如何定义“类和实体”之间的区别?当我们执行make:migration和doctrine:migration:migrate时,实体将编辑数据库,类将在不接触数据库的情况下操作数据当然,也将这些类放入
实体/
目录,然后从中删除所有
@ORM
注释。现在必须在自定义操作声明中实现自己的或声明
read=false
。在任何情况下,请记住,控制器必须返回类的实例。如果答案解决了你的问题,别忘了接受它。非常感谢你,唯一的办法就是删除orm注释?没有办法将类公开为api资源?