自定义Sonata管理类中的Symfony2@UniqueEntity


Symfony2 @UniqueEntity in custom Sonata Admin Class

这是我的实体示例代码。

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);
        }
    }
}

这里的记录是在不考虑约束验证的情况下创建的。

我不知道我可能错过了什么,但肯定有一些事情我需要修复。

有什么想法吗?

我设法修复了它,我不清楚这是最好的方法还是没有遵循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);
        }
    }
}