Что я делаю не так? Expected argument of type "string", "null" given at property path "password"

Сущность [1]

    /**
 * @var string
 *
 * @ORM\Column(name="password", type="string", nullable=true, length=128, options={"comment":"Пароль пользователя"})
 * @Assert\Regex(
 * pattern="/^[0-9A-Za-z-]+$/",
 * message="Пароль может содержать только латинские буквы A-z, цифры 0-9 и тире"
 * )
 * @Assert\NotBlank
 * @Assert\Length(
 *     min=8,
 *     max=24,
 *     minMessage="Длина пароля не соответствует минимальным требованиям. Min: 8, Мах: 24",
 *     maxMessage="Длина пароля не соответствует минимальным требованиям. Min: 8, Мах: 24")
 */
private $password;

Форма[2]

 public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('name', TextType::class, array(
            'label' => 'Имя',
            'required' => true,
            'attr' => array(
                'placeholder' => 'Введите имя'
            )))

        ->add('phone', TextType::class, array(
            'label' => 'Телефон',
            'required' => true,
            'attr' => array(
                'placeholder' => 'Введите телефон'
            )))
        ->add('email', TextType::class, array(
            'label' => 'Email',
            'attr' => array(
                'placeholder' => 'Введите email'
            )))
        ->add('password', RepeatedType::class, array(
            'type' => PasswordType::class,
            'label' => 'Новый пароль',
            'required' => false,
            'invalid_message' => 'Поля паролей должны совпадать',
            'first_options' => array('label' => 'Новый пароль',  'attr' => array(
                'placeholder' => 'Не менее 8 символов',

            )),
            'attr' => [
                'autocomplete' => 'off'
            ],
            'second_options' => array(
                'label' => 'Повторите новый пароль',
                'attr' => array(
                    'placeholder' => 'Не менее 8 символов',
                    'autocomplete' => 'off'
                ))));
}

twig[3]

   {% for passwordField in form_user.password %}
                    <div>
                        <span>{{ passwordField.vars.label }} </span>
                        {{ form_widget(passwordField) }}
                        <div class="form-error">
                            {{ form_errors(passwordField) }}
                        </div>
                    </div>
                {% endfor %}

Обработка[4]

if ($form_user->isSubmitted() && $form_user->isValid()) {
        $user = $form_user->getData();
        // Проверяем изменялся ли пароль
        if ($user->getPassword()) {
            // Меняем соль и генерируем пароль
            $encoder = new MessageDigestPasswordEncoder('sha512', true, 10);
            $user->setSalt(md5(time()));
            $user->setPassword($encoder->encodePassword($user->getPassword(), $user->getSalt()));
        } else {
            // Возвращаем старое значение пароля
            $user->setPassword($originPassword);
        }
        $entityManager = $this->getDoctrine()->getManager();
        $entityManager->persist($user);
        $entityManager->flush();
    }

Не пойму что делаю не так, пытаюсь сохранить форму без ввода пароля, это форма редактирования пользователя. Алгоритм таков, если пользователь не ввел пароль и отправил форму, то вставляем в форму старый пароль[4].

Раньше вроде такой код работал, но сейчас даже не знаю что не так.

Выдает ошибку

Expected argument of type "string", "null" given at property path "password".

Как можно это обойти?


Ответы (1 шт):

Автор решения: Harvi Dent

Проблема заключалась в моей сущности[1], а именно в методе setPassword

Раньше было

public function setPassword(string $password): self
{
    $this->password = $password;

    return $this;
}

Рабочий вариант

public function setPassword(?string $password): self
{
    $this->password = $password;

    return $this;
}
→ Ссылка