Symfony 4 формы - простая проверка на стороне сервера и объявления типа php - PullRequest
0 голосов
/ 22 марта 2019

Мои формы стандартные, за исключением кнопки отправки

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

Я отключил проверку html5 с помощью «formnovalidate» в кнопке отправки, потому что, например, здесь (Entity User)

/**
 * @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ошибка

Ожидаемый аргумент типа "string", "NULL", заданный в пути к свойству "fullName".

или это при добавлении нового пользователя

Возвращаемое значение App \ Entity \ User :: getFullName () должно иметь тип строки, возвращается ноль

Это

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

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

решает проблему, ноэто обычный способ сделать все "обнуляемым"?Интересно также ... Утверждения будут проверять значения сущностей после их установки?

----- ОБНОВЛЕНИЕ (вот функции контроллера пользователя) ------

/**
 * @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 ]

1 голос
/ 22 марта 2019

Как говорит ошибка, getFullName должен вернуть строку. Ваш метод получения:

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

Прежде чем вы заявили:

private $fullName;

Если вы измените его на:

private $fullName = '';

, то есть присвойте значение по умолчанию, получатель вернет пустую строку, и ошибка не должна быть выдана.

0 голосов
/ 22 марта 2019

Как вы обрабатываете этот запрос?

Вы должны использовать эту конструкцию

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(),
      ]);
  }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...