FOSUserBundle не работает Проверка

Я использую symfony 3.3 и php 7.0 с версией FOSUserBundle 2.1.1, и я просто осознаю, что в User Entity, если вы просто добавите в параметры установщика подсказку типа, например, такую ​​... проверка не будет выполнена.

<?php
namespace AppBundle\Entity;

use ...;

/**
 * @ORM\Entity
 * @ORM\Table(name="`user`")
 */
class User extends BaseUser
{
    /**
     * @Assert\NotBlank()
     * @var string
     * @ORM\Column(type="string", nullable=false)
     */
    private $firstName;

   /**
    * @return string
    */
    public function getFirstName()
    {
        return $this->firstName;
    }
    /**
    * @param string $firstName
    */
    public function setFirstName(string $firstName) <- IF YOU ADD THIS STRING AS THE PARAMETER THE VALIDATION FAILS
    {
        $this->firstName = $firstName;
    }
}

Итак, наконец, строка должна выглядеть следующим образом:

public function setFirstName($firstName)

Если кто-нибудь знает, как добавить шрифт без проблем с проверкой, будет приятно услышать новости.

3 ответа

Решение

Вот как Symfony Validator работает по умолчанию: сначала он устанавливает значение (null например), тогда проверка выполняется, а не другим способом. Потому что ваш метод не принимает null значения, только строки:

public function setFirstName(string $firstName)

Скорее всего, вы столкнулись с ошибкой Exception: Argument 1 passed to setFirstName() must be of the type string, null given,

Чтобы преодолеть это, вы должны установить пустые данные для соответствующего поля в '' или отсоедините ваши сущности от компонента формы. Или вы можете заставить метод принимать нулевые значения:

// php 7
public function setFirstName(string $firstName = null)
{
    $this->firstName = (string) $firstName;
}

// >= php7.1
public function setFirstName(?string $firstName)

Я призываю вас прекратить смешивать сущности с формами и валидаторами. Ваш основной домен должен быть свободен от проблем такого низкого уровня (см. SRP от SOLID). Также по виду ваших сеттеров я могу сказать, что вы движетесь к антипаттерну под названием Anemic Domain Model.

Ваш метод setFirstName() в классе User должен быть совместим с FOSUserBundle/Model/UserInterface->setFirstName($username)

Интерфейс не имеет подсказки, поэтому вы не можете добавить подсказку в свой метод...

Очевидно, что FOSUserBundle не позволяет вводить подсказки в данный момент, если вы хотите использовать функцию проверки.

Другие вопросы по тегам