我有一个运行 'swooletw/laravel-swoole' 来处理请求的 Laravel 应用程序。Doctrine 被用作 ORM,使用laravel-doctrine/orm
.
通常,如果学说抛出了一些 ORMException,它会关闭应该在下一次请求时自动打开/重置的 EntityManager。但是,当我使用 swoole 时,它不会简单地发生并且 EntityManager 保持关闭,除非重新启动 swoole 工作者。
我试图通过检查 entitmanager 是否已关闭并在中间件中将其重置来解决此问题。因此,在下一次请求时,它应该提供一个新的实体管理器。
protected function handleClosedManagers()
{
foreach (Registry::getManagerNames() as $managerName) {
/** @var EntityManager $manager */
$manager = Registry::getManager($managerName);
if (!$manager->isOpen()) {
Registry::resetManager($managerName);
$manager = Registry::getManager($managerName);
}
}
}
理想情况下它应该修复它,但我得到“EntityManager 已关闭”。例外。
我假设我也需要从 laravel 容器中刷新它。
所以我将代码更改为:
protected function handleClosedManagers()
{
foreach (Registry::getManagerNames() as $managerName) {
/** @var EntityManager $manager */
$manager = Registry::getManager($managerName);
if (!$manager->isOpen()) {
Registry::resetManager($managerName);
$manager = Registry::getManager($managerName);
app()->forgetInstance('doctrine.managers.'.$managerName);
app()->forgetInstance('mem');
app()->forgetInstance(MagentoEntityManager::class);
app()->singleton('doctrine.managers.'.$managerName, function () use ($manager) {
return $manager;
});
// we are using separate entitymanager than default one
app()->singleton('mem', function () use ($manager) {
return $manager;
});
}
}
}
现在我正在坚持这个:
ErrorException: Undefined index: 000000005ba55063000000001b2f101d in file /***/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php on line 3003
有人知道处理这种情况的正确方法吗?