为什么断言会跳过验证我的 symfony5 表单用户名字段?

Why assertion skips to validate my symfony5 form username field?

我的问题涉及用户表单中的一个字段,即用户名。由于断言验证适用于实体中的其他字段,我发现这样的行为很奇怪 - 跳过断言规则我确实指向用户实体中的用户名属性并将 null 属性传递给 userFormNewHandler,这会产生错误,尤其是当我发现它不是真的和其他领域不一样。我想知道,我错过了什么?

UserType.php:

<?php
namespace App\UserBundle\Form\Type;

use App\UserBundle\Entity\User;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints\NotBlank;

class UserType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('username', TextType::class, ['required'=>true,
                'invalid_message' => 'Username must not be empty!'])
            ->add('plainPassword', RepeatedType::class, array(
                'type'              => PasswordType::class,
                'mapped'            => false,
                'first_options'     => array('label' => 'New password'),
                'second_options'    => array('label' => 'Confirm new password'),
                'invalid_message' => 'The password fields must match.',
                'required' => true,
                'constraints' => [
                    new NotBlank([
                        'message' => 'Password field must not be blank!'
                    ])]
            ))

            ->add('active_status', ChoiceType::class, [
                'choices'  => [
                    'Active' => true,
                    'Inactive' => false,
                ],])
            ->add('first_name',TextType::class, [
                'required'=>true, 'invalid_message' => 'First name must not be empty!'])
            ->add('last_name', TextType::class, [
                'required'=>true, 'invalid_message' => 'Last name must not be empty!'])
            ->add('email', EmailType::class, [
                'required'=>true, 'invalid_message' => 'Email must not be empty!']);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => User::class,
        ]);
    }
}

这是我的 User.php 实体:

<?php

namespace App\UserBundle\Entity;

use App\UserBundle\Repository\UserRepository;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Validator\Constraints as Assert;


/**
 * @ORM\Entity(repositoryClass=UserRepository::class)
 */
class User implements UserInterface, PasswordAuthenticatedUserInterface
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=180, unique=true)
     * @Assert\NotBlank(message="Fill username field")
     */
    private $username;

    /**
     * @ORM\Column(type="json")
     */
    private $roles = [];

    /**
     * @var string The hashed password
     * @ORM\Column(type="string")
     */
    private $password;

    /**
     * @ORM\Column(type="boolean")
     */
    private $active_status;

    /**
     * @ORM\Column(type="string", length=30)
     * @Assert\NotBlank(message="Fill first name field")
     */
    private $first_name;

    /**
     * @ORM\Column(type="string", length=30)
     * @Assert\NotBlank(message="Fill last name field")
     */
    private $last_name;

    /**
     * @ORM\Column(type="string", length=40)
     * @Assert\NotBlank(message="Fill email field")
     */
    private $email;

    /**
     * Representation of account status
     */
    public function getActiveStatus(): bool
    {
        return $this->active_status;
    }

    /**
     * Setting account status
     */
    public function setActiveStatus(bool $active_status): self
    {
        $this->active_status = $active_status;

        return $this;
    }
        /**
 * Representation of username
 */
public function getUsername(): string
{
    return (string) $this->username;
}

/**
 * Setting username for user
 */
public function setUsername(string $username): self
{
    $this->username = $username;

    return $this;
}

    //...

还有 _form.html.twig,其中正在呈现表单:

{{ form_start(form, { attr: {novalidate: 'novalidate'} }) }}
    {{ form_widget(form) }}
    <button class="btn" >{{ button_label|default('Save') }}</button>
{{ form_end(form) }}

我找到了!那是因为我确实在 setter Username 的方法中指出要严格查找字符串,我想这阻止了我将 null 属性传递给表单。现在 PHP 验证工作正常:)

部分生成错误:

User.php

/**
 * Setting username for user
 */
public function setUsername(string $username): self
{
    $this->username = $username;

    return $this;
}

修复:

/**
 * Setting username for user
 */
public function setUsername($username): self
{
    $this->username = $username;

    return $this;
}