Проблема:

Валидатор игнорирует значения, записанные в полях формы (игнорирует, например, name , id и title ). Я что-то делаю не так?

.

Детали:

1. Я создал базовую HTML-форму в Symfony 4 без использования компонента Forms:

<form action="{{ path("register") }}" method="post">
    <input type="text" name="username">
    <input type="text" name="email">
    <input type="password" name="password">
    <input type="hidden" name="submitted">
    <button type="submit">Create user</button>
</form>

2. Теперь, прежде чем вставить пользователя в БД, я пытаюсь проверить данные формы с помощью компонента Symfony Validator, но помните: я не использую компонент Forms, и именно так я делаю это:

use App\Entity\User
use /-- ... --/

class SecurityController extends Controller {

     /**
      * @Route("/register", name="register")
      */

      public function showRegisterPage(Request $request) {

         if ($request->request->get("submitted") !== null) {

             $user = new User();
             $validator = $this->get("validator");
             $errors = $validator->validate($user);

             if (count($errors) === 0) {
                 /-- Insert the user in the database. --/
             }
         }

         return $this->render("security/register.html.twig");
      }
}

3. Для проверки данных валидатор использует объект с именем User, который содержит, среди прочего, правила проверки - на данный момент только NotBlank () :

namespace App\Entity

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Security\Core\User\UserInterface;

/**
 * @ORM\Entity
 * @ORM\Table(name="user")
 */

class User implements UserInterface {

     /**
      * @ORM\Id
      * @ORM\GeneratedValue(strategy="AUTO")
      * @ORM\Column(type="integer")
      */
     private $id;

     /**
      * @ORM\Column(type="string")
      * @Assert\NotBlank()
      */
     private $username;

     /**
      * @ORM\Column(type="string")
      * @Assert\NotBlank()
      */
     private $password;

     /**
      * @ORM\Column(type="string")
      * @Assert\NotBlank()
      */
      private $email;

      /-- Getters and Setter here --/
}

Мне нужно знать, почему Validator не распознает поля формы; Панель отладки показывает, что действительно есть 3 пустых поля. Я думал, что Валидатор использовал имя поля, я также попробовал id и title , все не удалось.

Как я могу взять данные из полей, чтобы проверить их с помощью Validator без использования компонента Forms?

1
Juan Nicolás 20 Дек 2017 в 09:22

1 ответ

Лучший ответ

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

По крайней мере, это означает, что вам нужно будет заполнить объект пользователя вручную :

if ($request->request->get("submitted") !== null) {

    $user = new User();

    // populate:
    $user->setUsername($request->request->get('username'));
    //...

    $validator = $this->get("validator");
    $errors = $validator->validate($user);

    if (count($errors) === 0) {
        /-- Insert the user in the database as above. --/
    }
}

Обратите внимание, что это не поможет вам на самом деле отображать ошибки проверки внутри представления. Для этого вам нужно передать $errors в представление и вручную проверить каждое поле. Но все это можно сделать (более или менее) автоматически с помощью компонента формы.

2
Yoshi 20 Дек 2017 в 07:38