Symfony REST API - 如何处理无效表单

Symfony REST API - how to handle invalid form

Symfony 4 作为后端,Angular 作为前端。我有一个简单的表格 - 假设两个字段不能为空。

实体:

/**
 * @var string
 *
 * @ORM\Column(name="signature", type="string", length=32, unique=true)
 * @JMSSerializer\Expose
 */
private $signature;

/**
 * @var int
 *
 * @ORM\Column(name="status", type="integer")
 * @JMSSerializer\Expose
 */
private $status;

因此默认值为 NOT NULL。

将其中一个字段留空并提交表单后,我收到 500 错误。 Dev.log 说:"Integrity constraint violation: 1048 Column 'status' cannot be null"。明显地。但是如何捕获这个错误呢?或者可能只是阻止提交 Angular 侧有空白字段的表单?

我的控制器:

public function postAction(Request $request)
{
    $form = $this->createForm('App\Form\ItemType', null, [
        'csrf_protection' => false,
    ]);
    $form->submit($request->request->all());

    if (!$form->isValid()) {            
        return $form;
    }
    ...

按照其他地方的建议,我可以发送一系列错误:

$errors = [];
foreach ($form->getErrors(true) as $error) {
    if ($error->getOrigin()) {
        $errors[$error->getOrigin()->getName()][] = $error->getMessage();
    }
}

但从未调用 isValid() 方法。

BTW) 在这种情况下,return 表单作为响应是个好主意吗?我在一些教程中看到过这个。但也许 returning

new View(null, Response::HTTP_BAD_REQUEST) 

加上一些额外的信息会是更好的选择吗?

你好@Tompo,如果你想使用表单进行验证,你需要在你的实体中这样做

use Symfony\Component\Validator\Constraints as Assert;

/**
 * @var string
 *
 * @ORM\Column(name="signature", type="string", length=32, unique=true)
 * @Assert\NotBlank(message="Please enter a signature")
 * @JMSSerializer\Expose
 */
private $signature;

/**
 * @var int
 *
 * @ORM\Column(name="status", type="integer")
 * @Assert\NotBlank(message="Please enter a status")
 * @JMSSerializer\Expose
 */
private $status;

现在你可以在文件为空时接到电话,之后你需要编辑你的控制器以显示错误消息