代码之家  ›  专栏  ›  技术社区  ›  goldlife

@实体中的doctrineasert\UniqueEntity()-如何将其与条令事件传递

  •  1
  • goldlife  · 技术社区  · 7 年前

    有这样一个产品实体:

    /**
     * Class Product.
     *
     * @DoctrineAssert\UniqueEntity("itemNumber")
     * 
     */
    class Product
    {
        /**
         * @ORM\Column(type="string", length=64, unique=true)
         */
        private $itemNumber;
        .
        .
        .
    

    但在某些情况下,我想推翻这种“独特”的行为。 我需要在表单级别上进行此重写。在数据库级别,应该保留唯一的行为。我想通过一个表单事件来实现这一点,文章编号得到一个前缀。类似这样:

    /**
     * Class BaseProductEventListener.
     */
    class ProductCreateListener
    {   
        /**
         * @param LifecycleEventArgs $eventArgs
         */
        public function prePersist(LifecycleEventArgs $eventArgs)
        {
            $entity = $eventArgs->getObject();
    
            if (!$entity instanceof Product) {
                return;
            }
    
            if (!$entity->getCategories() instanceof ArrayCollection) {
                return;
            }
    
            if (isset($entity->getCategories()[0])) {
                $firstCat = $entity->getCategories()[0];
    
                if ($firstCat->getNameSlug() == 'my_nameslug') {
                    $entity->setItemNumber('my_prefix_'.$entity->getItemNumber());
                }
            }
        }
    }
    

    因此,如果我的产品有特定的类别,itemnumber将在数据库级别获得前缀。

    问题是,我的事件将在实体断言后激发: @DoctrineAssert\Uniquentity(“项目编号”)

    如何更改我的事件先更改文章编号,然后在表单中检查实体断言?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Ollie in PGH    7 年前

    如果您在表单级别需要它,您可以随时添加一个表单事件侦听器。示例:

    ->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
                    $form = $event->getForm();
                    $data = $event->getData();
                    //// your logic here ...
    
    })
    

    这会在表单提交数据之前截取数据,远远早于Doctrine persist事件。

    表单事件 docs here