From 0b6d5214b0051fbb52c90e9d9b30d3df96f57657 Mon Sep 17 00:00:00 2001 From: Patrick Carlo-Hickman Date: Thu, 25 Aug 2016 07:21:31 +0000 Subject: [PATCH 1/2] Add tests for checking if the PDO connection is created. --- .../DatabaseConnectionFactoryTest.php | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tests/Database/DatabaseConnectionFactoryTest.php b/tests/Database/DatabaseConnectionFactoryTest.php index 7967b879911e..13a847d52f8f 100755 --- a/tests/Database/DatabaseConnectionFactoryTest.php +++ b/tests/Database/DatabaseConnectionFactoryTest.php @@ -43,6 +43,30 @@ public function testConnectionCanBeCreated() $this->assertInstanceOf('PDO', $this->db->connection('read_write')->getReadPdo()); } + public function testSingleConnectionNotCreatedUntilNeeded() + { + $connection = $this->db->connection(); + $pdo = new \ReflectionProperty(get_class($connection), 'pdo'); + $pdo->setAccessible(true); + $readPdo = new \ReflectionProperty(get_class($connection), 'readPdo'); + $readPdo->setAccessible(true); + + $this->assertNotInstanceOf('PDO', $pdo->getValue($connection)); + $this->assertNotInstanceOf('PDO', $readPdo->getValue($connection)); + } + + public function testReadWriteConnectionsNotCreatedUntilNeeded() + { + $connection = $this->db->connection('read_write'); + $pdo = new \ReflectionProperty(get_class($connection), 'pdo'); + $pdo->setAccessible(true); + $readPdo = new \ReflectionProperty(get_class($connection), 'readPdo'); + $readPdo->setAccessible(true); + + $this->assertNotInstanceOf('PDO', $pdo->getValue($connection)); + $this->assertNotInstanceOf('PDO', $readPdo->getValue($connection)); + } + /** * @expectedException InvalidArgumentException */ From 4c43262bcf160f7a6da48452201b96ec759e81ce Mon Sep 17 00:00:00 2001 From: Patrick Carlo-Hickman Date: Thu, 25 Aug 2016 07:21:51 +0000 Subject: [PATCH 2/2] Defer resolving the PDO connection for both read and write connections. --- src/Illuminate/Database/Connection.php | 4 ++++ .../Database/Connectors/ConnectionFactory.php | 21 +++++++++++++------ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/Illuminate/Database/Connection.php b/src/Illuminate/Database/Connection.php index b8796af0b8c8..e920e8fa4918 100755 --- a/src/Illuminate/Database/Connection.php +++ b/src/Illuminate/Database/Connection.php @@ -970,6 +970,10 @@ public function getReadPdo() return $this->getPdo(); } + if ($this->readPdo instanceof Closure) { + return $this->readPdo = call_user_func($this->readPdo); + } + return $this->readPdo ?: $this->getPdo(); } diff --git a/src/Illuminate/Database/Connectors/ConnectionFactory.php b/src/Illuminate/Database/Connectors/ConnectionFactory.php index b46de392c80c..f6710762c0d9 100755 --- a/src/Illuminate/Database/Connectors/ConnectionFactory.php +++ b/src/Illuminate/Database/Connectors/ConnectionFactory.php @@ -57,9 +57,7 @@ public function make(array $config, $name = null) */ protected function createSingleConnection(array $config) { - $pdo = function () use ($config) { - return $this->createConnector($config)->connect($config); - }; + $pdo = $this->createPdoResolver($config); return $this->createConnection($config['driver'], $pdo, $config['database'], $config['prefix'], $config); } @@ -81,13 +79,24 @@ protected function createReadWriteConnection(array $config) * Create a new PDO instance for reading. * * @param array $config - * @return \PDO + * @return \Closure */ protected function createReadPdo(array $config) { - $readConfig = $this->getReadConfig($config); + return $this->createPdoResolver($this->getReadConfig($config)); + } - return $this->createConnector($readConfig)->connect($readConfig); + /** + * Create a new Closure that resolves to a PDO instance. + * + * @param array $config + * @return \Closure + */ + protected function createPdoResolver(array $config) + { + return function () use ($config) { + return $this->createConnector($config)->connect($config); + }; } /**