Проверка Symfony2 завершилась неудачно для двух объектов встраивания с одинаковым полем имени - PullRequest
2 голосов
/ 30 января 2012

У меня есть две сущности, Запас и Страна, связанные с отношением «многие к одному». У обоих есть поле с именем "акроним".

В форме добавления акции отображаются поле Акроним акции и список стран.

При сохранении нового запаса в контроллере произошла ошибка с сообщением «Это значение не должно быть пустым». Похоже, что это вызвано валидатором (NotBlank) из поля аббревиатуры Country.

Два решения на данный момент: 1. переименовать поле акронима Stock в stock_acronym; 2. или удалите валидатор NotBlank для поля аббревиатуры Country.

В обоих случаях это решило проблему, но я бы хотел найти более чистое решение ...

Вот код:

class Stock
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string $acronym
     *
     * @ORM\Column(name="acronym", type="string", length=10)
     * @Assert\MinLength(
     *     limit=2,
     *     message="Acronym must have at least {{ limit}} characters."
     * )
     */
    private $acronym;

    /**
     * @ORM\ManyToOne(targetEntity="Admin\GeoBundle\Entity\Country", inversedBy="country_stocks")
     * @ORM\JoinColumn(name="country_id", referencedColumnName="id")
     */
    protected $country;

.....

class Country
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string $country_name
     * @Assert\NotBlank()
     * @ORM\Column(name="country_name", type="string", length=70)

     */
    private $country_name;

    /**
     * @var string $country_name
     * @Assert\NotBlank()
     * @ORM\Column(name="acronym", type="string", length=2)
     */
    private $acronym;

/**
 * @ORM\OneToMany(targetEntity="Admin\GeoBundle\Entity\Stock", mappedBy="country")
 * @var ArrayCollection $country_stocks
 */
protected $country_stocks;

.....

StockType:

public function buildForm(FormBuilder $builder, array $options)
{
    $builder->add('acronym'); // this is the Stock acronym
    $builder->add('country', 'entity', array(
        'class' => 'Admin\GeoBundle\Entity\Country',
        'property' => 'country_name',
        'query_builder' => function (\Admin\GeoBundle\Entity\CountryRepository $repository)
                            {return $repository->createQueryBuilder('s');}
                ));
}

.....

Контроллер акций:

/**
 * @Route("/admin/stock/add/{id}", name="_admin_stock_add", requirements = {"id" = "\d+"}, defaults={"id" = null})
 * @Template()
 */
public function addAction($id)
{
  $request = $this->get('request');
  $em = $this->get('doctrine')->getEntityManager();

  if($id){
    $stock = $em->getRepository('AdminGeoBundle:Stock')->find($id);
    if (null === $stock){
        throw new NotFoundHttpException('The stock to be edited could not be found');
    }
  }else{
    $stock = new \Admin\GeoBundle\Entity\Stock();
  }

  $form = $this->get('form.factory')->create(new \Admin\GeoBundle\Form\Type\StockType(), $stock);

  if ('POST' == $request->getMethod()){
      $form->bindRequest($request);
        if ($form->isValid()){
            if(!$id){
              $stock->SetCreated(new \Datetime());
              $em->persist($stock);
            }
            $em->flush();
        }else{
          var_dump($form->getErrors());
        }
  }
  return $this->redirect($this->generateUrl('_admin_stock'));  
}
...