EntityManager закрыт? - PullRequest
       11

EntityManager закрыт?

0 голосов
/ 18 сентября 2018

Я получил ошибку в строке 167, это говорит мне, что EntityManager закрыт?Я использовал symfony2, а также aurelia.Я поставил «processUserDetails» для прохождения через него.

 private function processUserDetails($library, $entity, $oldDetails, $settings) {
        $newDetails = $entity->getDetails();
        $em = $this->getDoctrine()->getManager();

        $this->disableBlameableEventListeners($em);

        foreach($oldDetails as $detail) {
            if(!$newDetails->contains($detail)) {
                $library->removeResource($detail->getResource());
                $em->remove($detail);
            }
        }

        $em->flush();
        $this->enableBlameableEventListeners($em);

        foreach($newDetails as $detail)
            if(!$detail->getId()) $em->persist($detail);

        $em->flush();

        foreach($newDetails as $detail) {
            $resource = $detail->getResource();

            if(!$library->getResources()->contains($resource))
                $library->addResource($resource);
        }
        $em->flush();
        if($this->getUser() === $entity->getUser()) {
            $this->putMembershipContactSetting($entity, $settings);
            $locale = $entity->getLocale();

            if($locale && $entity->getUser()->getLocale() !== $locale)
                $this->setUserLocale($entity);

            $em->flush();
        }
    }

 public function putMembershipAction(Request $request, Company $company, Membership $entity) {
        if(!$this->canTouchIt($company, 'RolesManage') && $this->getUser() !== $entity->getUser())
            return FOSView::create('Unauthorized', Codes::HTTP_UNAUTHORIZED);

        $em = $this->getDoctrine()->getManager();
        $settings = $request->request->get('contact_settings');

        $request->setMethod('PATCH');
        $library = $entity->getAssets();

        $form = $this->createForm(
            new MembershipType($this->isAdminUser()), $entity,
            array('method' => $request->getMethod())
        );

        $oldDetails = $entity->getDetails();
        $entity->setDetails(new ArrayCollection);

        $this->removeExtraFields($request, $form);
        $form->handleRequest($request);



        if($form->isValid()) {

            if($entity->getPermissions())
                $entity->getPermissions()->setMembership($entity);

            if($entity->getStatus() === Membership::STATUS_ACCEPTED)
                $this->processUserDetails($library, $entity, $oldDetails, $settings);

            $this->get('desygner_brand.membership.manager')
                ->addMemberToGlobalGroup($entity);

            $serializer = $this->get('jms_serializer');
            $context = SerializationContext::create()->setGroups(array('membership'));
            $this->get('monolog.logger.behaviour')->error('Company log #'.$company->getId(), array(
                'type' => 'Modify memeber',
                'user' => $this->getUser()->getId(),
                'data' => json_decode($this->get('jms_serializer')
                    ->serialize($entity, 'json', $context), true
                ),
            ));

            return $entity;
        }

        return FOSView::create(array('errors' => $form->getErrors()), Codes::HTTP_PRECONDITION_FAILED);
    }

enter image description here

Я получил ошибку в строке 167, в которой сообщалось, что EntityManager закрыт?Я использовал symfony2 И aurelia, я поставил «processUserDetails» для прохождения через него.

МОЖЕТ ЛЮБОЙ ЛЮБОЙ ПОМОЧЬ МНЕ?

1 Ответ

0 голосов
/ 19 сентября 2018

Вы слишком рано покраснели в processUserDetails.Требуется рефакторинг метода / класса, чтобы убедиться, что flush() вызывается в соответствующее время.Одно из быстрых решений - позволить методу принять EntityManager в качестве параметра и необязательный параметр, чтобы запретить сброс в конце:

private function processUserDetails($em, $library, $entity, $oldDetails, $settings, $doNotFlush) {
    $newDetails = $entity->getDetails();

    $this->disableBlameableEventListeners($em);

    foreach($oldDetails as $detail) {
        if(!$newDetails->contains($detail)) {
            $library->removeResource($detail->getResource());
            $em->remove($detail);
        }
    }

    // flushing too early ?
    // $em->flush();
    $this->enableBlameableEventListeners($em);

    foreach($newDetails as $detail)
        if(!$detail->getId()) $em->persist($detail);

    // flushing too early ?
    // $em->flush();

    foreach($newDetails as $detail) {
        $resource = $detail->getResource();

        if(!$library->getResources()->contains($resource))
            $library->addResource($resource);
    }
    // flushing too early ?
    // $em->flush();
    if($this->getUser() === $entity->getUser()) {
        $this->putMembershipContactSetting($entity, $settings);
        $locale = $entity->getLocale();

        if($locale && $entity->getUser()->getLocale() !== $locale)
            $this->setUserLocale($entity);

        // flushing too early ?
        $em->flush();
    }

    if (!doNotFlush) {
        $em->flush();
    }
}

Затем внутри вашего putMembershipAction():

if($entity->getStatus() === Membership::STATUS_ACCEPTED)
    $this->processUserDetails($em, $library, $entity, $oldDetails, $settings, true);

// .... 


// before return, flush it
$em->flush();
// now returns
return $entity;

Обратите внимание, что это меняет работу вашего processUserDetails, вы должны повторно проверить поток.Ключевым моментом является удержание каждой сущности в памяти и вызов только flush() один раз в конце.

...