I have a Laravel application which is running 'swooletw/laravel-swoole' to handle requests. Doctrine is being used as ORM using laravel-doctrine/orm
.
Normally if some ORMException is thrown by doctrine it closes the EntityManager which is supposed to be opened/reset automatically on next request. But while I am using swoole it does not simply happen and EntityManager remains closed unless the swoole worker is restarted.
I tried to fix this by checking if entitmanager is closed and resetting it in a Middleware. So on next request it should supply a new entity manager.
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);
}
}
}
Ideally it should fix it but I am getting "EntityManager is Closed." exception.
I assumed that I need to refresh it from laravel container as well.
So i changed the code to this:
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;
});
}
}
}
Now I am getting this on persist :
ErrorException: Undefined index: 000000005ba55063000000001b2f101d in file /***/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php on line 3003
Anyone know the proper way to handle this situation?