Skip to content

Commit 9f7d523

Browse files
committed
VERY ROUGH first draft. (just makes it work)
No psalm work No code cleanup No additional test Signed-off-by: Joey Smith <jsmith@webinertia.net> Signed-off-by: Joey Smith <jsmith@webinertia.net>
1 parent 73aec39 commit 9f7d523

File tree

7 files changed

+145
-3
lines changed

7 files changed

+145
-3
lines changed

src/ConfigProvider.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use PhpDb\Adapter\Mysql\Metadata\Source\MysqlMetadata;
1515
use PhpDb\Adapter\Platform\PlatformInterface;
1616
use PhpDb\Adapter\Profiler;
17+
use PhpDb\Container\AdapterAbstractServiceFactory;
1718
use PhpDb\Container\AdapterManager;
1819
use PhpDb\Container\MetadataFactory;
1920
use PhpDb\Metadata\MetadataInterface;
@@ -32,6 +33,9 @@ public function __invoke(): array
3233
public function getDependencies(): array
3334
{
3435
return [
36+
'abstract_factories' => [
37+
AdapterAbstractServiceFactory::class,
38+
],
3539
'aliases' => [
3640
MetadataInterface::class => MysqlMetadata::class,
3741
],
@@ -65,6 +69,9 @@ public function getAdapterManagerConfig(): array
6569
PdoDriverInterface::class => Driver\Pdo\Pdo::class,
6670
Profiler\ProfilerInterface::class => Profiler\Profiler::class,
6771
ResultSet\ResultSetInterface::class => ResultSet\ResultSet::class,
72+
'ConnectionFactoryFactory' => Container\ConnectionFactoryFactory::class,
73+
'DriverFactoryFactory' => Container\DriverFactoryFactory::class,
74+
'PlatformFactoryFactory' => Container\PlatformFactoryFactory::class,
6875
],
6976
'factories' => [
7077
AdapterInterface::class => Container\AdapterFactory::class,
@@ -80,6 +87,11 @@ public function getAdapterManagerConfig(): array
8087
Profiler\Profiler::class => InvokableFactory::class,
8188
ResultSet\ResultSet::class => InvokableFactory::class,
8289
],
90+
'invokables' => [
91+
Container\ConnectionFactoryFactory::class => Container\ConnectionFactoryFactory::class,
92+
Container\DriverFactoryFactory::class => Container\DriverFactoryFactory::class,
93+
Container\PlatformFactoryFactory::class => Container\PlatformFactoryFactory::class,
94+
],
8395
];
8496
}
8597
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpDb\Adapter\Mysql\Container;
6+
7+
use PhpDb\Container\AdapterManager;
8+
use PhpDb\Adapter\Mysql\Container\MysqliConnectionFactory;
9+
use PhpDb\Adapter\Mysql\Container\PdoConnectionFactory;
10+
use PhpDb\Adapter\Mysql\Driver\Mysqli\Mysqli;
11+
use PhpDb\Adapter\Mysql\Driver\Pdo\Pdo;
12+
use Psr\Container\ContainerInterface;
13+
use RuntimeException;
14+
15+
use function array_key_exists;
16+
use function sprintf;
17+
18+
final class ConnectionFactoryFactory
19+
{
20+
public function __invoke(
21+
ContainerInterface $container,
22+
string $requestedName
23+
): callable {
24+
$adapterConfig = $container->get('config')['db']['adapters'] ?? [];
25+
if (! isset($adapterConfig[$requestedName]['driver'])) {
26+
throw new \RuntimeException(sprintf(
27+
'Named adapter "%s" is not configured with a driver',
28+
$requestedName
29+
));
30+
}
31+
$adapterServices = $container->get('config')[AdapterManager::class];
32+
$configuredDriver = $adapterConfig[$requestedName]['driver'];
33+
if (array_key_exists($configuredDriver, $adapterServices['aliases'])) {
34+
$aliasTo = $adapterServices['aliases'][$configuredDriver];
35+
} else {
36+
$aliasTo = $configuredDriver;
37+
}
38+
return match ($aliasTo) {
39+
Mysqli::class => new MysqliConnectionFactory(),
40+
Pdo::class => new PdoConnectionFactory(),
41+
default => throw new RuntimeException(sprintf(
42+
'No connection factory found for driver "%s"',
43+
$configuredDriver
44+
)),
45+
};
46+
}
47+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpDb\Adapter\Mysql\Container;
6+
7+
use PhpDb\Container\AdapterManager;
8+
use Psr\Container\ContainerInterface;
9+
10+
use function sprintf;
11+
12+
final class DriverFactoryFactory
13+
{
14+
public function __invoke(ContainerInterface $container, string $requestedName): callable
15+
{
16+
$adapterConfig = $container->get('config')['db']['adapters'] ?? [];
17+
if (! isset($adapterConfig[$requestedName]['driver'])) {
18+
throw new \RuntimeException(sprintf(
19+
'Named adapter "%s" is not configured with a driver',
20+
$requestedName
21+
));
22+
}
23+
$adapterServices = $container->get('config')[AdapterManager::class];
24+
25+
$configuredDriver = $adapterConfig[$requestedName]['driver'];
26+
$aliasTo ??= $adapterServices['aliases'][$configuredDriver] ?? $configuredDriver;
27+
$driverFactory = $adapterServices['factories'][$aliasTo];
28+
return new $driverFactory();
29+
}
30+
}

src/Container/MysqliConnectionFactory.php

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,18 @@
44

55
namespace PhpDb\Adapter\Mysql\Container;
66

7+
use Laminas\ServiceManager\Factory\FactoryInterface;
78
use PhpDb\Adapter\Driver\ConnectionInterface;
89
use PhpDb\Adapter\Mysql\Driver\Mysqli\Connection;
910
use Psr\Container\ContainerInterface;
1011

11-
final class MysqliConnectionFactory
12+
final class MysqliConnectionFactory implements FactoryInterface
1213
{
13-
public function __invoke(ContainerInterface $container): ConnectionInterface&Connection
14-
{
14+
public function __invoke(
15+
ContainerInterface $container,
16+
string $requestedName,
17+
?array $options = null
18+
): ConnectionInterface&Connection {
1519
/** @var array $config */
1620
$config = $container->get('config');
1721

@@ -23,4 +27,10 @@ public function __invoke(ContainerInterface $container): ConnectionInterface&Con
2327

2428
return new Connection($connectionConfig);
2529
}
30+
31+
public static function createFromConfig(ContainerInterface $container, string $requestedName): ConnectionInterface&Connection
32+
{
33+
$adapterConfig = $container->get('config')['db']['adapters'][$requestedName] ?? [];
34+
return new Connection($adapterConfig['connection'] ?? []);
35+
}
2636
}

src/Container/MysqliDriverFactory.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,27 @@ public function __invoke(ContainerInterface $container): Driver\DriverInterface&
4141
$options
4242
);
4343
}
44+
45+
public static function createFromConfig(
46+
ContainerInterface $container,
47+
string $requestedName,
48+
): Driver\DriverInterface&Mysqli\Mysqli {
49+
50+
/** @var AdapterManager $adapterManager */
51+
$adapterManager = $container->get(AdapterManager::class);
52+
$connectionFactory = ($adapterManager->get('ConnectionFactoryFactory'))($container, $requestedName);
53+
/** @var array $config */
54+
$config = $container->get('config');
55+
/** @var array $dbConfig */
56+
$dbConfig = $config['db'] ?? [];
57+
/** @var array $adapterConfig */
58+
$adapterConfig = $dbConfig['adapters'][$requestedName] ?? [];
59+
60+
return new Mysqli\Mysqli(
61+
$connectionFactory::createFromConfig($container, $requestedName),
62+
$adapterManager->get(Mysqli\Statement::class),
63+
$adapterManager->get(Mysqli\Result::class),
64+
$adapterConfig['options'] ?? []
65+
);
66+
}
4467
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpDb\Adapter\Mysql\Container;
6+
7+
use PhpDb\Adapter\Mysql\Container\PlatformInterfaceFactory;
8+
9+
final class PlatformFactoryFactory
10+
{
11+
public function __invoke(): PlatformInterfaceFactory
12+
{
13+
return new PlatformInterfaceFactory();
14+
}
15+
}

src/Container/PlatformInterfaceFactory.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,9 @@ public function __invoke(ContainerInterface $container): PlatformInterface&Mysql
3333

3434
return new Mysql($driverInstance);
3535
}
36+
37+
public static function fromDriver(DriverInterface $driverInstance): PlatformInterface&Mysql
38+
{
39+
return new Mysql($driverInstance);
40+
}
3641
}

0 commit comments

Comments
 (0)