Files
michaelschiemer/src/Framework/Database/LazyConnectionFactory.php

91 lines
3.2 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Framework\Database;
use App\Framework\Database\Driver\DriverConfig;
use App\Framework\Database\Exception\DatabaseException;
use ReflectionClass;
final readonly class LazyConnectionFactory
{
public static function createLazyGhost(
array|DriverConfig $config,
string $connectionClass = PdoConnection::class
): ConnectionInterface {
$reflection = new ReflectionClass($connectionClass);
// Stelle sicher, dass die Klasse ConnectionInterface implementiert
if (!$reflection->implementsInterface(ConnectionInterface::class)) {
throw new DatabaseException(
"Class {$connectionClass} must implement ConnectionInterface"
);
}
// Erstelle LazyGhost mit Initializer
$ghost = $reflection->newLazyGhost(
initializer: function (object $object) use ($config, $connectionClass): void {
self::initializeLazyConnection($object, $config, $connectionClass);
}
);
return $ghost;
}
private static function initializeLazyConnection(
object $ghost,
array|DriverConfig $config,
string $connectionClass
): void {
// Erstelle die echte Verbindung
$realConnection = DatabaseFactory::createDirectConnection($config);
// Kopiere alle Properties von der echten Verbindung in das Ghost
$ghostReflection = new ReflectionClass($ghost);
$realReflection = new ReflectionClass($realConnection);
// Für PdoConnection: kopiere die PDO-Instanz
if ($realConnection instanceof PdoConnection) {
$pdoProperty = $realReflection->getProperty('pdo');
$ghostPdoProperty = $ghostReflection->getProperty('pdo');
$ghostPdoProperty->setValue($ghost, $pdoProperty->getValue($realConnection));
}
// Zusätzliche Properties falls vorhanden
foreach ($realReflection->getProperties() as $property) {
if ($ghostReflection->hasProperty($property->getName())) {
$ghostProperty = $ghostReflection->getProperty($property->getName());
$ghostProperty->setValue($ghost, $property->getValue($realConnection));
}
}
}
public static function isLazyGhost(object $object): bool
{
$reflection = new ReflectionClass($object);
return $reflection->isUninitializedLazyObject($object);
}
public static function initializeLazyGhost(object $object): void
{
$reflection = new ReflectionClass($object);
if ($reflection->isUninitializedLazyObject($object)) {
$reflection->initializeLazyObject($object);
}
}
public static function resetLazyGhost(object $object): void
{
$reflection = new ReflectionClass($object);
if (!$reflection->isUninitializedLazyObject($object)) {
$reflection->resetAsLazyGhost($object, function (object $obj) use ($object): void {
// Re-initialize with same logic as original
// This would require storing the original config somewhere
throw new DatabaseException('LazyGhost reset requires stored configuration');
});
}
}
}