Symfony 4,参数1传递给。。必须是DateTime的实例,给定null

Symfony 4,参数1传递给。。必须是DateTime的实例,给定null,symfony,datetime,symfony4,Symfony,Datetime,Symfony4,我的问题很相关,但不完全相同。这是一个关于你是否读过它的后续问题,但它并不太依赖于它,所以只读这个问题就足够了。我有这个方法来保存对“小屋”的“触摸”(我知道这很奇怪)。我(尝试)从POST请求中提取信息,并使用POSTMAN进行测试 /** *@param Request$Request *@throws\Doctrine\ORM\orException *@throws\Doctrine\ORM\OptimisticLockException *@throws\ErrorException

我的问题很相关,但不完全相同。这是一个关于你是否读过它的后续问题,但它并不太依赖于它,所以只读这个问题就足够了。我有这个方法来保存对“小屋”的“触摸”(我知道这很奇怪)。我(尝试)从POST请求中提取信息,并使用POSTMAN进行测试


/**
*@param Request$Request
*@throws\Doctrine\ORM\orException
*@throws\Doctrine\ORM\OptimisticLockException
*@throws\ErrorException
*@return-JsonResponse
*/
公共函数寄存器触摸(请求$Request)
{
$touchService=新的touchService($this->entityManager);
$cabinet=$request->get('cabinet_id');
/**
*@var$touch-touch
*/
$touch=新触摸(
$request->get('time'),
$request->get('toucher'),
$request->get('cabinet\u id'),
$request->get('id')
);
如果(空($CAB)){
返回新的JsonResponse(['error'=>'Touch not saved'],200);
}否则{
$touch->setCabinet($cabinet);
$touchService->registerTouch($touch);
返回新的JsonResponse(['success'=>'Touch saved'],200);
}
触摸类包括以下内容:


问题是您正在将字符串传递给
Touch
的构造函数,但您正在使用
DateTime$time
进行类型暗示,因此它需要一个
DateTime
对象

要解决问题,请在将字符串传递给构造函数之前,将其转换为
DateTime

/** @var $cabinet Cabinet|null */
$cabinet = $this->entityManager->getRepository(Cabinet::class)->findOneBy([
    'id' => $request->get('cabinet_id')
]);

if (null === $cabinet) {
    return new JsonResponse(['error' => 'Touch not saved'], 200);
}

/** @var $touch Touch */
$touch = new Touch(
    new \DateTime($request->get('time')),
    $request->get('toucher'),
    $cabinet,
    (int)$request->get('id')
);
$touchService->registerTouch($touch);

return new JsonResponse(['success' => 'Touch saved'], 200);

<强> ToP<<强> >考虑使用<代码>数据> > DATEIME/<代码> .< /P>正确格式不使它成为<代码> DATESTIME//COD>对象,您必须在某个时间点转换它。参见.EHEMMEL,这不会导致我丢失格式和可能的数据,如时区吗?这将如何工作?因为我需要将“touch”存储在数据库中。@ehymel我也用这个

“time”尝试了上面的
time
:“2018-06-18 11:51:22”,
,但我仍然得到相同的错误。你的
touch::\u construct()
函数需要一个php
DateTime
对象。但是当你调用
$touch=new touch(…)
无论字符串是否为特定格式,您都在有效地传递字符串。在调用
new Touch(…)
之前,您必须满足自己代码的类型要求。请参阅我的第一条注释。尝试
转储($request)
并告诉我们您有什么。谢谢您的回答!如果您不介意,有两个小问题:1)为什么改为DateTimeImmutable?2)这确实解决了问题,但对于传递给App\Entity\Touch的其余元素
参数2:\uu construct()必须为整型,给定为null,在第89行的/var/www/learningProject/src/Controller/apituchcontroller.php中调用(500内部服务器错误)
我是否也应该将其转换为整数以及其他类似的东西?这是如何工作的?因为
new\int
不是一件事,答案是循环更新的。关于
DateTime
vs
DateTimeImmutable
建议。互联网上有很多关于这个主题的文章(例如,)。只需谷歌一下:)再次感谢!最后一个问题,当类型提示CAB时,我得到了这个问题:
方法调用使用1个参数,但方法签名使用的参数少了0个…
。我的CAB类遇到了这个问题:有什么办法吗?哦,我明白了。您必须根据给定的参数从数据库中提取CAB实体类似于
$this->entityManager->getRepository(Cabinet::class)->findOneBy(['id'->$request->get('Cabinet\u id'))
。更新了答案。几天后,您是否知道为什么JsonResponse无论如何都不会返回?一切正常,触摸正在注册,一切正常,但邮递员将此作为回应:
{“headers”:{}
。我也尝试返回响应和其他类型,但无论我尝试什么,都不会返回任何内容。
/** @var $cabinet Cabinet|null */
$cabinet = $this->entityManager->getRepository(Cabinet::class)->findOneBy([
    'id' => $request->get('cabinet_id')
]);

if (null === $cabinet) {
    return new JsonResponse(['error' => 'Touch not saved'], 200);
}

/** @var $touch Touch */
$touch = new Touch(
    new \DateTime($request->get('time')),
    $request->get('toucher'),
    $cabinet,
    (int)$request->get('id')
);
$touchService->registerTouch($touch);

return new JsonResponse(['success' => 'Touch saved'], 200);