【问题标题】:Assert unique validation in Sonata Admin在 Sonata Admin 中断言唯一验证
【发布时间】:2013-02-26 10:08:30
【问题描述】:

我在一个项目中使用 Symfony 2.1。我使用 SonataAdminBundle 进行管理。 我想在我的管理类中向我的 slug 属性添加一个断言。我该怎么做?

在我的实体中,我设置了断言,但它似乎在这里不起作用:(

相关代码: 实体:

/*
 * @ORM\Table(name="default_doctor_specialty")
 * @UniqueEntity("uniqueSlugName")
 * @ORM\Entity
 */
class Test {
 //..
    /**
 * @var string
 * @Gedmo\Slug(fields={"name"},unique=false)
 * 
 * @ORM\Column(name="unique_slug_name", type="string", length=255, nullable=false , unique=true)
 */
private $uniqueSlugName;
}

在管理类中:

class TestAdmin extends Admin {

protected $formOptions = array(
    'validation_groups' => 'Default'
);
 //...
  }

为什么默认验证不起作用???

& 即使不能这样工作,我如何在管理类中设置唯一验证???

感谢您的回答:)

【问题讨论】:

    标签: validation symfony unique sonata-admin


    【解决方案1】:

    最后我为我的实体定义了一个验证组:

    use Symfony\Bridge\Doctrine\Validator\Constraints as DoctrineAssert;
    /*
     * @ORM\Table(name="default_doctor_specialty")
    * @DoctrineAssert\UniqueEntity(fields="uniqueSlugName", message="A Speciality with same slug already exists", groups={"test"})
    * @ORM\Entity
    */
    class Test {
    //..
    /**
    * @var string
    * @Gedmo\Slug(fields={"name"},unique=false)
    * 
    * @ORM\Column(name="unique_slug_name", type="string", length=255, nullable=false , unique=true)
    */
    private $uniqueSlugName;
    }
    

    在管理类中我使用了测试验证组而不是默认组!

    感谢 github 上的AHWEBDEV

    【讨论】:

    • 谢谢Parisssss 因为我在奏鸣曲中找到了唯一验证的解决方案,但我无法很好地进行这种类型的验证,但使用你的代码我已经解决了我的问题。
    【解决方案2】:

    来自link

    这是完整的例子,它取决于你的 symfony 和奏鸣曲版本。

    // src/AppBundle/Entity/Service.php
    namespace AppBundle\Entity;
    
    use Doctrine\ORM\Mapping as ORM;
    use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
    
    /**
     * @ORM\Entity
     * @UniqueEntity(
     *     fields={"host", "port"},
     *     errorPath="port",
     *     message="This port is already in use on that host."
     * )
     */
    class Service
    {
        /**
         * @ORM\ManyToOne(targetEntity="Host")
         */
        public $host;
    
        /**
         * @ORM\Column(type="integer")
         */
        public $port;
    }
    

    【讨论】:

      【解决方案3】:

      我不希望用数百行诸如验证之类的低级细节来弄乱我的实体。可以在 Admin 类中定义验证规则。通常,管理员的验证规则与客户端的验证规则不同。

      final class TestAdmin
      {
          // … skipped for brevity
      
          public function validate(ErrorElement $errorElement, $object)
          {
              $errorElement->addConstraint(new UniqueEntity(['fields' => ['slug']]));
          }
      }
      

      【讨论】:

      • 这是更好的解决方案,无需更改实体类。
      • 验证方法已弃用。现在应该使用自定义约束并使用管理员的 formOptions 属性将它们添加到表单中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多