تم تغيير كائن تغيير Symfony في النموذج باستخدام المستمع

0

أنا أستخدم Symfony 3.4 ولدي شيء غريب يجب القيام به ، سأحاول أن أشرح بوضوح.

لدي كيان Website و WebsiteFormType ، في هذا WebsiteFormType لدي مستمع مثل: (في السطر الأول من buildForm() في شكل النوع)

$builder->addEventSubscriber(new WebsiteListener();

في هذا المستمع ، أحتاج إلى التحقق من تحديث قيمة معينة عند إرسال النموذج ، وإذا تم تحديث هذه القيمة ، فأنا بحاجة إلى تكرار الكائن الخاص بي ، على سبيل المثال عندما أقوم بتحديث موقع الويب الخاص بي وأغير url من عند http://xxx.xx إلى http://yyyy.yy أقوم بتكرار موقع الويب الأول لإنشاء الموقع الثاني بدلاً من تحديث الحقل url .

أستخدم في هذا المستمع preSubmit و postSubmit .

مشكلتي هي ، عندما أقوم بتغيير عنوان url ، أحتاج إلى تغيير موقع الويب المرتبط بالنموذج.

إذا http://xxx.xx هو WebsiteA و http://yyyy.yy هو WebsiteB ، عندما أرسل WebsiteA وأغير عنوان url ، أحتاج إلى تغيير كائن موقع الويب المرتبط بالنموذج من WebsiteA إلى WebsiteB ....

هذا إذا قمت بإعادة التحقق من صحة النموذج بعد ذلك ، فهو WebsiteB الذي تم التحقق منه وليس WebsiteA.

لا أعرف إذا كنت تفهم مشكلتي :) شكرا!

1 إجابة

0

حاول استخدام Doctrine EventSubscriber مثل:

class OrderListener implements EventSubscriber {

protected $statusChanges = false;

public function getSubscribedEvents()
{
    return array(
        'preUpdate',
        'postUpdate',
    );
}

public function preUpdate(PreUpdateEventArgs $args)
{
    $changeSet = $args->getEntityChangeSet();
    foreach ($changeSet as $key => $arr) {

        if ($key === 'status' && (int)$arr[0] !== (int)$arr[1]) {
            $this->statusChanges = true;
        }
    }
}

public function postUpdate(LifecycleEventArgs $args)
{
    $entity = $args->getObject();

    if ($entity instanceof Order && $this->statusChanges) {
        $repo = $args->getObjectManager()->getRepository(Action::class);
        $action = new Action();
        $action->setOrder($entity)
            ->setStatus($entity->getStatus())
            ->setCost($entity->getCost())
            ->setTimeAt(new \DateTime())
            ->setPoint($entity->getPoint())
            ->setDescription($entity->getDescription())
            ->setService($entity->getService())
        ;

        $repo->persistAndFlush($action); // custom method, you can use $args->getObjectManager()->persist($action) and $args->getObjectManager()->flush($action)
    }
}
}
:مؤلف

أسئلة ذات صلة

فوق
قائمة طعام