у меня есть 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;
}
}
Я наконец нашел решение проблемы.
Оказывается, мой 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
учебный класс.
Вы можете отключить проверку, указав несуществующую группу проверки в типе формы:
/**
* {@inheritdoc}
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(['validation_groups' => ['no-validation']]); // Do not validate entities.
}
Не нашел лучшего решения: /