@@ -23,28 +23,94 @@ final class Factory
2323 ];
2424
2525
26- /** @internal */
27- public function createConnectorFromDsn (
26+ public function __construct (
27+ private bool $ lazy = true ,
28+ ) {
29+ }
30+
31+
32+ public function createFromParameters (
33+ #[\SensitiveParameter]
34+ ...$ params ,
35+ ): Connection
36+ {
37+ $ params = count ($ params ) === 1 && is_array ($ params [0 ] ?? null ) ? $ params [0 ] : $ params ;
38+ $ factory = $ this ->createConnectorFromParameters ($ params );
39+ return $ this ->createFromConnector ($ factory );
40+ }
41+
42+
43+ public function createFromDsn (
2844 string $ dsn ,
2945 ?string $ username = null ,
3046 #[\SensitiveParameter]
3147 ?string $ password = null ,
3248 array $ options = [],
49+ ): Connection
50+ {
51+ $ factory = $ this ->createConnectorFromDsn ($ dsn , $ username , $ password , $ options );
52+ return $ this ->createFromConnector ($ factory );
53+ }
54+
55+
56+ /**
57+ * @param \Closure(): Drivers\Connection $connector
58+ */
59+ public function createFromConnector (\Closure $ connector ): Connection
60+ {
61+ $ connection = new Connection ($ connector );
62+ if (!$ this ->lazy ) {
63+ $ connection ->connect ();
64+ }
65+ return $ connection ;
66+
67+ }
68+
69+
70+ /** @internal */
71+ public function createConnectorFromParameters (
72+ #[\SensitiveParameter]
73+ array $ params ,
3374 ): \Closure
3475 {
3576 if ($ class = $ params ['driverClass ' ] ?? null ) {
3677 if (!is_subclass_of ($ class , Drivers \Connection::class)) {
3778 throw new \LogicException ("Driver class ' $ class' is not subclass of " . Drivers \Connection::class);
3879 }
80+ unset($ params ['driverClass ' ]);
3981
40- } else {
41- $ driver = explode (': ' , $ dsn )[0 ];
42- $ class = self ::Drivers['pdo- ' . $ driver ] ?? null ;
82+ } elseif ($ driver = $ params ['driver ' ] ?? null ) {
83+ $ class = self ::Drivers[$ driver ] ?? null ;
4384 if (!$ class ) {
44- throw new \LogicException ("Unknown PDO driver ' $ driver'. " );
85+ throw new \LogicException ("Unknown driver ' $ driver'. " );
4586 }
87+ unset($ params ['driver ' ]);
88+
89+ } elseif ($ params ['dsn ' ] ?? null ) {
90+ return $ this ->createConnectorFromDsn (...$ params );
91+
92+ } else {
93+ throw new \LogicException ("Missing options 'driver' or 'driverClass'. " );
4694 }
4795
96+ return fn () => new $ class (...$ params );
97+ }
98+
99+
100+ /** @internal */
101+ public function createConnectorFromDsn (
102+ string $ dsn ,
103+ ?string $ username ,
104+ #[\SensitiveParameter]
105+ ?string $ password ,
106+ array $ options = [],
107+ ): \Closure
108+ {
109+ $ driver = explode (': ' , $ dsn )[0 ];
110+ $ class = self ::Drivers['pdo- ' . $ driver ] ?? null ;
111+ if (!$ class ) {
112+ throw new \LogicException ("Unknown PDO driver ' $ driver'. " );
113+ }
48114 return fn () => new $ class ($ dsn , $ username , $ password , $ options );
49115 }
50116}
0 commit comments