Symfony2 @UniqueEntity в пользовательском классе администратора Sonata

Это мой пример кода сущностей.

EntityOne.php

//....
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
//....

/**
* EntityOne
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="AppBundle\Entity\EntityOneRepository")
* @UniqueEntity(
*     fields={"entityTwo", "number"},
*     errorPath="number",
*     message="A entityTwo with this number already exists."* )
*/
class EntityOne
{

//....

/**
* @ORM\ManyToOne(targetEntity="EntityTwo", inversedBy="entityOne")
* @ORM\JoinColumn(name="entitytwo_id", referencedColumnName="id")
*/
protected $entityTwo;

/**
* @var integer
*
* @ORM\Column(name="number", type="integer")
*
* @Assert\NotBlank()
*/
private $number;

//....

}

EntityTwo.php

/**
* EntityTwo
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="AppBundle\Entity\EntityTwoRepository")
*/
class EntityTwo
{

//....

/**
*
* @ORM\OneToMany(targetEntity="EntityOne", mappedBy="entityTwo", cascade={"persist"}, orphanRemoval=true)
* @ORM\OrderBy({"number" = "ASC"})
*/
protected $entityOne;

/**
* @var integer
*
* @ORM\Column(name="totals", type="integer")
*
* @Assert\NotBlank()
*/
private $totals;

//....

}

Я использую SonataAdminBundle с регулярный Администратор класса сущности все отлично работает.

Проблема с @UniqueEntity в другом месте.
В другом административном классе создайте номер записи EntityOne, этот номер зависит от значения поля в EntityOne.

Для этого я делаю это следующим образом:

EntityTwoAdmin.php

class EntityTwoAdmin extends Admin {

//....

protected $formOptions = array(
'cascade_validation' => true
);

//....

public function preUpdate($entityTwo) {

$numTotals = $entityTwo->getTotals();
$numEntityOneExist = $entityTwo->getEntityOne()->count();

for ($i = $numEntityOneExist; $i <= $numTotals; $i++) {

$entityOneNew = new \AppBundle\Entity\EntityOne;

$entityOneNew->setNumber($i);

$entityTwo->addEntityOne($entityOneNew);
}

}
}

Здесь записи создаются без учета проверки ограничения.

Я не знаю, чего мне не хватает, но, безусловно, что-то мне нужно исправить.

есть идеи?

1

Решение

Мне удалось это исправить, мне не ясно, является ли это лучшим способом или не следую лучшим практикам Symfony.

Я поделюсь здесь, для тех, кто может помочь:

EntityTwoAdmin.php

public function preUpdate($entityTwo) {

$numTotals = $entityTwo->getTotals();
$numEntityOneExist = $entityTwo->getEntityOne()->count();

for ($i = $numEntityOneExist; $i <= $numTotals; $i++) {

$entityOneNew = new \AppBundle\Entity\EntityOne;
$entityOneNew->setNumber($i);
$entityOneNew->setEntityTwo($entityTwo);

$validator = $this->getConfigurationPool()->getContainer()->get('validator');
$errors = $validator->validate($entityOneNew);

if (count($errors) == 0) {

$entityTwo->addEntityOne($entityOneNew);

}
}

}
0

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

Других решений пока нет …

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