Symfony 4表单-简单的服务器端验证和php类型声明

时间:2019-03-22 10:42:54

标签: php symfony

除提交按钮外,我的表格是标准表格

    {{ form_start(form) }}
    {{ form_widget(form) }}
    <input type="submit" value="{{ 'action.save'|trans }}" formnovalidate />
    {{ form_end(form) }}

我在“提交”按钮中使用“ formnovalidate”禁用了html5验证, 因为,例如这里(实体用户)

/**
 * @ORM\Column(type="string")
 * @Assert\NotBlank(message="assert.notblanc")
 * @Assert\Length(
 *      min = 2,  minMessage = "assert.minmessage",
 *      max = 50, maxMessage = "assert.maxmessage"
 * )
 */
private $fullName;

只有一条简单的消息“请匹配请求的格式”(Firefox), 关于长度。不太好。

但是现在,通过“服务器端验证”,我无法像往常一样使用PHP类型声明。

public function getFullName(): string
{
    return $this->fullName;
}

public function setFullName(string $fullName): void
{
    $this->fullName = $fullName;
}

如果提交了空的全名,则会出现symfony错误

  

在属性路径“ fullName”处给出的类型为“ string”,“ NULL”的预期参数。

或在添加新用户时使用此

  

App \ Entity \ User :: getFullName()的返回值必须是字符串类型,返回null

public function getFullName(): ?string
{
    return $this->fullName;
}

public function setFullName(?string $fullName): void
{
    $this->fullName = $fullName;
}

解决了问题,但这是通常的方法,使所有内容“都为空”吗? 我也想知道...设置值后,断言者将检查Entity值吗?

-----更新(这里是用户控制器功能)------

/**
 * @Route(
 *     path = "/user-add",
 *     name = "user_add"
 * )
 */
public function addUser(Request $request)
{
    $user = new User();

    // Update and check user
    $form = $this->createForm(UserType::class, $user);
    $form->handleRequest($request);
    if ($form->isSubmitted() && $form->isValid()) {

        // Save it
        $this->entityManager->persist($user);
        $this->entityManager->flush();
        $this->addFlash('notice', 'Your changes were saved!');

        return $this->redirectToRoute('user_list');
    }

    return $this->render('user/user_add_update.html.twig', [
        'form' => $form->createView()
    ]);
}

/**
 * @Route(
 *     path = "/user-update/{id<[1-9]\d*>}",
 *     name = "user_update"
 * )
 */
public function updateUser(int $id, Request $request)
{
    // Get user
    $user = $this->userRepository->find($id);
    if (!$user) {
        throw $this->createNotFoundException('No user found for id ' . $id);
    }

    // Update and check user
    $form = $this->createForm(UserType::class, $user);
    $form->handleRequest($request);
    if ($form->isSubmitted() && $form->isValid()) {

        // Save it
        $this->entityManager->persist($user);
        $this->entityManager->flush();
        $this->addFlash('notice', 'Your changes were saved!');

        return $this->redirectToRoute('user_list');
    }

    return $this->render('user/user_add_update.html.twig', [
        'form' => $form->createView(),
    ]);
}

2 个答案:

答案 0 :(得分:1)

错误提示getFullName必须返回一个字符串。您的getter方法是:

public function getFullName(): string
{
    return $this->fullName;
}

在您声明之前:

private $fullName;

如果将其更改为:

private $fullName = '';

也就是说,分配一个默认值,getter将返回一个空字符串,并且不应引发错误。

答案 1 :(得分:0)

您如何处理此请求?

您必须使用此构造

public function someControllerMethod(Request $reqest) {
  $form = $this->createForm(UserType::class);
  $form->handleRequest($request);

  if ($form->isSubmited && $form->isValid()){
      $user = $form->getData();
      // do some stuff
      return $this->redirect ...
  } else {
      return $this->render('editingPage.html.twig', [
        'form' => $form->createView(),
      ]);
  }
 }