Workaround doctrine serialisation issue in integration tests
Doctrine uses a default ProxyClassNameResolver but it is implemented as an anonymous class and can not be serialised. This commit adds a custom ProxyClassNameResolver that copies the anonymous one so that we avoid using the anonymous fallback. [MAILPOET-3658]
This commit is contained in:
committed by
Veljko V
parent
e0e4c507dd
commit
f77392ade4
27
lib/Doctrine/ProxyClassNameResolver.php
Normal file
27
lib/Doctrine/ProxyClassNameResolver.php
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace MailPoet\Doctrine;
|
||||||
|
|
||||||
|
use MailPoetVendor\Doctrine\Persistence\Mapping\ProxyClassNameResolver as IProxyClassNameResolver;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is exact copy of an anonymous class from \MailPoetVendor\Doctrine\Persistence\Mapping\AbstractClassMetadataFactory
|
||||||
|
* We need to use a non-anonymous class so that it is serializable within integration tests
|
||||||
|
* @see https://github.com/doctrine/persistence/blob/2.2.x/lib/Doctrine/Persistence/Mapping/AbstractClassMetadataFactory.php#L516-L536
|
||||||
|
*/
|
||||||
|
class ProxyClassNameResolver implements IProxyClassNameResolver {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @template T
|
||||||
|
* @return class-string<T>
|
||||||
|
*/
|
||||||
|
public function resolveClassName(string $className) : string {
|
||||||
|
$pos = \strrpos($className, '\\' . \MailPoetVendor\Doctrine\Persistence\Proxy::MARKER . '\\');
|
||||||
|
if ($pos === \false) {
|
||||||
|
/** @var class-string<T> */
|
||||||
|
return $className;
|
||||||
|
}
|
||||||
|
/** @var class-string<T> */
|
||||||
|
return \substr($className, $pos + \MailPoetVendor\Doctrine\Persistence\Proxy::MARKER_LENGTH + 2);
|
||||||
|
}
|
||||||
|
}
|
@@ -22,6 +22,7 @@ class TablePrefixMetadataFactory extends ClassMetadataFactory {
|
|||||||
throw new \RuntimeException('DB table prefix not initialized');
|
throw new \RuntimeException('DB table prefix not initialized');
|
||||||
}
|
}
|
||||||
$this->prefix = Env::$dbPrefix;
|
$this->prefix = Env::$dbPrefix;
|
||||||
|
$this->setProxyClassNameResolver(new ProxyClassNameResolver());
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getMetadataFor($className) {
|
public function getMetadataFor($className) {
|
||||||
|
Reference in New Issue
Block a user