Symfony2 Doctrine - 在 kernel.response 侦听器中刷新错误数据
Symfony2 Doctrine - Flushing in kernel.response listener flushs bad data
为了为我的 Symfony2 应用程序做一些日志记录,我创建了一个记录任何连接的服务,这是在 kernel.response 上调用的方法:
public function log(FilterResponseEvent $event)
{
$log = new Log();
$request = $event->getRequest();
$response = $event->getResponse();
//fill the Log entity with stuff from request & response data
$manager = $this->container->get('doctrine.orm.entity_manager');
$manager->persist($log);
$manager->flush();
}
所有这一切看起来都很好,但是当我执行这样的测试时(用空数据修补以触发失败):
$this->client->request(
'PATCH',
'/users/testificate',
array(
'firstName' => '',
)
);
哪个调用这个动作:
protected function processForm($item, $method = 'PATCH')
{
$form = $this->createForm(new $this->form(), $item, array('method' => $method));
$form->handleRequest($this->getRequest());
if ($form->isValid()) {
$response = new Response();
// Set the `Location` header only when creating new resources
if ($method == 'POST') {
$response->setStatusCode(201);
$response->headers->set('Location',
$this->generateUrl(
'get_' . strtolower($class), array('slug' => $item->getId()),
true // absolute
)
);
}
else {
$response->setStatusCode(204);
}
$this->em->flush();
return $response;
}
$this->em->detach($item);
return RestView::create($form, 400);
}
虽然测试失败了,但是实体打了补丁,当然不能。
经过一番搜索,我了解到:
- 参数输入表单验证器
- 验证失败,因此返回 400 http 代码而不刷新实体
- 但是在验证过程中,实体被无效数据水化
- 当在 kernel.response 上调用服务时,$manager->flush();刷新所有数据...包括 PATCH 测试提供的错误数据。
到目前为止我尝试过的:
1) 做一个 $manager->clear();在 $manager->persist(); 之前...没有改变任何东西
2) 执行 $manager->detach($item);如果表单验证失败...不会改变任何东西
谢谢!
我最近在从 Doctrine 2.3.4 升级到最新的 2.4 分支时偶然发现了刷新 kernel.response
的问题。尝试清除 kernel.terminate
中的日志实体。在 kernel.response
.
中保留对响应的任何修改
为了为我的 Symfony2 应用程序做一些日志记录,我创建了一个记录任何连接的服务,这是在 kernel.response 上调用的方法:
public function log(FilterResponseEvent $event)
{
$log = new Log();
$request = $event->getRequest();
$response = $event->getResponse();
//fill the Log entity with stuff from request & response data
$manager = $this->container->get('doctrine.orm.entity_manager');
$manager->persist($log);
$manager->flush();
}
所有这一切看起来都很好,但是当我执行这样的测试时(用空数据修补以触发失败):
$this->client->request(
'PATCH',
'/users/testificate',
array(
'firstName' => '',
)
);
哪个调用这个动作:
protected function processForm($item, $method = 'PATCH')
{
$form = $this->createForm(new $this->form(), $item, array('method' => $method));
$form->handleRequest($this->getRequest());
if ($form->isValid()) {
$response = new Response();
// Set the `Location` header only when creating new resources
if ($method == 'POST') {
$response->setStatusCode(201);
$response->headers->set('Location',
$this->generateUrl(
'get_' . strtolower($class), array('slug' => $item->getId()),
true // absolute
)
);
}
else {
$response->setStatusCode(204);
}
$this->em->flush();
return $response;
}
$this->em->detach($item);
return RestView::create($form, 400);
}
虽然测试失败了,但是实体打了补丁,当然不能。 经过一番搜索,我了解到:
- 参数输入表单验证器
- 验证失败,因此返回 400 http 代码而不刷新实体
- 但是在验证过程中,实体被无效数据水化
- 当在 kernel.response 上调用服务时,$manager->flush();刷新所有数据...包括 PATCH 测试提供的错误数据。
到目前为止我尝试过的: 1) 做一个 $manager->clear();在 $manager->persist(); 之前...没有改变任何东西 2) 执行 $manager->detach($item);如果表单验证失败...不会改变任何东西
谢谢!
我最近在从 Doctrine 2.3.4 升级到最新的 2.4 分支时偶然发现了刷新 kernel.response
的问题。尝试清除 kernel.terminate
中的日志实体。在 kernel.response
.