Symfony 3.4 - EntityManager已关闭

时间:2018-03-29 13:06:31

标签: php mysql symfony doctrine-orm orm

我有一个使用Symfony 3.4和MySql运行的应用程序,我收到一个错误:'EntityManager已关闭'。我的应用程序运行两种方式:

1 - 每次都是由sh脚本调用的控制台应用程序。此控制台应用程序在数据库表中进行了许多插入。

2 - 也在同一表中插入的HTTP路由。

当de console app在后台运行时,如果我调用http路由,我会收到错误'EntityManager is closed'。如果我停止de backgroud应用程序http路由工作。这就好像两个应用程序控制台和http使用相同的实例EntityManager。

我的代码:

我创建一个名为AbstractRepositoryService的服务。我管理存储库的所有服务都应该扩展。

<?php

abstract class AbstractRepositoryService
{

    /**
     *  
     * @var EntityManagerIntergace - $em
    */
    protected $em;

    /**
     * 
     * @param EntityManagerInterface $em
    */
    public function __construct(EntityManagerInterface $em) {

        $this->em = $em;
    }

    /**
     *
     * 
     * @param String
     * 
     * @return @mixed
     * 
     * @throws RuntimeException
    */
    public function __call($method, $args) {

        $repository = $this->em->getRepository(static::ENTITY);

        if (!method_exists($repository, $method)) {

            throw new RuntimeException(
                sprintf("Method '%s' not found.", $method), 
                500
            );
        }

        try {

            return call_user_func_array(array($repository, $method), $args);

        } catch(Exception $e) {

            throw new Exception($e->getMessage(), 500);
        }

    }
}

我的UserRepositoryService,其中在 flush方法

中抛出异常
<?php

final class UserRepositoryService extends AbstractRepositoryService
{
    /**
     * 
     * @const String
    */
    const ENTITY = 'AppBundle\\Entity\\User';

    /**
     * 
     * @param User
    */
    public function insert(User $user) {

        try {

            $this->em->persist($user);
            $this->em->flush($user);

        } catch (Exception $e) {

            throw new Exception($e->getMessage(), 500);
        }
    }
}

最后我的服务声明:

app.services.user_repository_service:
        public: true
        class: AppBundle\Services\UserRepositoryService
        arguments:
            - '@doctrine.orm.entity_manager'

1 个答案:

答案 0 :(得分:1)

解决!

我创建了一个方法,在插入之前生成新的EntityManager并立即工作。

protected function createNewEntityManager() {

    return $this->em->create(
        $this->em->getConnection(),
        $this->em->getConfiguration(),
        $this->em->getEventManager()
    );
}

在插入中:

public function insert(Crawler $crawler) {

    try {

        $this->createNewEntityManager();

        $this->em->persist($crawler);
        $this->em->flush($crawler);
        $this->em->close();

    } catch (Exception $e) {

        throw new Exception($e->getMessage(), 500);
    }
}