我有一个使用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'
答案 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);
}
}