Jer*_*emy 4 php symfony symfony-2.1
我正在使用Symfony2表单来验证对API的POST和PUT请求.表单处理将请求数据绑定到底层实体,然后验证实体.除收集错误外,一切都很顺利.我正在使用FOSRestBundle并抛出一个Symfony\Component\HttpKernel\Exception\HttpException,其中包含400状态代码和一条包含表单错误消息的消息,如果验证失败.FOSRestBundle处理将其转换为JSON响应.我必须执行所有这些的控制器方法如下所示(所有字段将其错误冒充到表单):
protected function validateEntity(AbstractType $type, $entity, Request $request)
{
$form = $this->createForm($type, $entity);
$form->bind($request);
if (! $form->isValid()) {
$message = ['Invalid parameters passed.'];
foreach ($form->getErrors() as $error) {
$message[] = $error->getMessage();
}
throw new HttpException(Codes::HTTP_BAD_REQUEST, implode("\n", $message));
}
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,当我通过$ form-> getErrors()收集表单级错误时,我只能访问错误消息而不是错误连接到的字段的名称.当POST或PUT参数对应于相关实体的id时,这是一个特殊问题.如果提交的值无效,则该错误消息只是"此值无效",在此上下文中不是很好.理想情况下,我想做以下任何一种情况:
Dan*_*ler 13
并且对于symfony> = 2.2
private function getErrorMessages(\Symfony\Component\Form\Form $form) {
$errors = array();
foreach ($form->getErrors() as $key => $error) {
$template = $error->getMessageTemplate();
$parameters = $error->getMessageParameters();
foreach ($parameters as $var => $value) {
$template = str_replace($var, $value, $template);
}
$errors[$key] = $template;
}
if ($form->count()) {
foreach ($form as $child) {
if (!$child->isValid()) {
$errors[$child->getName()] = $this->getErrorMessages($child);
}
}
}
return $errors;
}
Run Code Online (Sandbox Code Playgroud)
小智 8
使用此函数可在绑定表单后获取所有错误消息.
private function getErrorMessages(\Symfony\Component\Form\Form $form) {
$errors = array();
foreach ($form->getErrors() as $key => $error) {
$template = $error->getMessageTemplate();
$parameters = $error->getMessageParameters();
foreach($parameters as $var => $value){
$template = str_replace($var, $value, $template);
}
$errors[$key] = $template;
}
if ($form->hasChildren()) {
foreach ($form->getChildren() as $child) {
if (!$child->isValid()) {
$errors[$child->getName()] = $this->getErrorMessages($child);
}
}
}
return $errors;
}
Run Code Online (Sandbox Code Playgroud)
您可以将getErrorsAsString方法作为示例来获取所需的功能.您还必须invalid_message在表单字段上设置选项以更改This value is invalid消息.
对于 Symfony 4.x+(可能适用于较低版本)。
// $form = $this->createForm(SomeType::class);
// $form->submit($data);
// if (!$form->isValid()) {
// var_dump($this->getErrorsFromForm($form));
// }
private function getErrorsFromForm(FormInterface $form, bool $child = false): array
{
$errors = [];
foreach ($form->getErrors() as $error) {
if ($child) {
$errors[] = $error->getMessage();
} else {
$errors[$error->getOrigin()->getName()][] = $error->getMessage();
}
}
foreach ($form->all() as $childForm) {
if ($childForm instanceof FormInterface) {
if ($childErrors = $this->getErrorsFromForm($childForm, true)) {
$errors[$childForm->getName()] = $childErrors;
}
}
}
return $errors;
}
Run Code Online (Sandbox Code Playgroud)