Форма Symfony с полем EntityType выдает ошибку «Это значение не должно быть пустым», если поле имеет ограничение Valid () в классе объекта

у меня есть Phone класс и Country класс в проекте Symfony 2.8.
Одно из полей Phone класс $country который является Country объект.

У меня также есть форма с полем EntityType, которую я использую для выбора из списка стран в моей базе данных.

Моя проблема заключается в том, что когда я выбираю страну из выпадающего меню, созданного в поле EntityType, и отправляю форму, я получаю сообщение об ошибке «Это значение не должно быть пустым». несколько раз над выпадающим меню EntityField.

Что странно, что я делаю dump($phone) после $form->handleRequest($request); и поле $ country показывает правильный объект Country, выбранный из базы данных.

Это происходит только тогда, когда @Assert\Valid() ограничение на $country поле. Как только я уберу это, ошибка исчезнет.
Дело в том, что я хочу продолжать проверять поле страны моего Phone учебный класс.

Любые идеи о том, почему это происходит, будет принята с благодарностью!

Phone учебный класс:

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
* Phone
*
* @ORM\Table(name="phones", uniqueConstraints={@ORM\UniqueConstraint(name="natural_pk", columns={"phone_name", "country_id", "phone_number", "extension"})})
* @ORM\Entity(repositoryClass="AppBundle\Repository\PhoneRepository")
* @ORM\HasLifecycleCallbacks
*/
class Phone
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*
* @Assert\Type(type="int")
*/
protected $id;

/**
* @var Country
*
* @ORM\ManyToOne(targetEntity="Country")
* @ORM\JoinColumn(nullable=false)
*
* @Assert\NotBlank()
* @Assert\Valid()
*/
protected $country;

/**
* @var string
*
* @ORM\Column(name="phone_number", type="string", length=20, nullable=false)
*
* @Assert\NotBlank()
* @Assert\Type(type="string")
* @Assert\Length(max=20)
*/
protected $phoneNumber;

public function __toString()
{
return $this->phoneNumber;
}

/**
* Get id
*
* @return int
*/
public function getId()
{
return $this->id;
}

/**
* Set phoneNumber
*
* @param string $phoneNumber
*
* @return Phone
*/
public function setPhoneNumber($phoneNumber)
{
$this->phoneNumber = $phoneNumber;

return $this;
}

/**
* Get phoneNumber
*
* @return string
*/
public function getPhoneNumber()
{
return $this->phoneNumber;
}

/**
* Set country
*
* @param \AppBundle\Entity\Country $country
*
* @return Phone
*/
public function setCountry(\AppBundle\Entity\Country $country)
{
$this->country = $country;

return $this;
}

/**
* Get country
*
* @return \AppBundle\Entity\Country
*/
public function getCountry()
{
return $this->country;
}
}

Класс страны:

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
* Country
*
* @ORM\Table(name="countries")
* @ORM\Entity(repositoryClass="AppBundle\Repository\CountryRepository")
*/
class Country
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*
* @Assert\Type(type="int")
*/
protected $id;

/**
* @var string
*
* @ORM\Column(name="country_name", type="string", length=255, nullable=false)
*
* @Assert\NotBlank()
* @Assert\Type(type="string")
* @Assert\Length(max=255)
*/
protected $countryName;

/**
* @var string
*
* @ORM\Column(name="phone_code", type="string", length=10, nullable=false)
*
* @Assert\NotBlank()
* @Assert\Type(type="string")
* @Assert\Length(max=10)
*/
protected $phoneCode;

public function __toString()
{
return $this->phoneCode;
}

/**
* Get id
*
* @return int
*/
public function getId()
{
return $this->id;
}

/**
* Set countryName
*
* @param string $countryName
*
* @return Country
*/
public function setCountryName($countryName)
{
$this->countryName = $countryName;

return $this;
}

/**
* Get countryName
*
* @return string
*/
public function getCountryName()
{
return $this->countryName;
}

/**
* Set phoneCode
*
* @param string $phoneCode
*
* @return Country
*/
public function setPhoneCode($phoneCode)
{
$this->phoneCode = $phoneCode;

return $this;
}

/**
* Get phoneCode
*
* @return string
*/
public function getPhoneCode()
{
return $this->phoneCode;
}
}

1

Решение

Я наконец нашел решение проблемы.
Оказывается, мой Country класс на самом деле имеет другое поле из двунаправленной ассоциации под названием $provinces и это поле имеет Valid() ограничение также:

/**
* @var Province[]
*
* @ORM\OneToMany(targetEntity="Province", mappedBy="country")
*
* @Assert\Valid()
*/
protected $provinces;

Это было причиной ошибки, я думаю, потому что если $provinces пустой массив, Country объект не выполняет Symfony’s Valid() ограничение.

Чтобы решить эту проблему, мне пришлось либо удалить Valid() ограничение на $provinces поле в классе Country или на $country поле в Phone учебный класс.

0

Другие решения

Вы можете отключить проверку, указав несуществующую группу проверки в типе формы:

/**
* {@inheritdoc}
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(['validation_groups' => ['no-validation']]); // Do not validate entities.
}

Не нашел лучшего решения: /

0

По вопросам рекламы [email protected]