Better DI for database.
authorCameron Ball <cameron@getapproved.com.au>
Wed, 24 Sep 2014 08:45:44 +0000 (16:45 +0800)
committerCameron Ball <cameron@getapproved.com.au>
Thu, 25 Sep 2014 03:45:58 +0000 (11:45 +0800)
DataAccess/DataMapper/DataMapper.php
DataAccess/DatabaseFactory.php [new file with mode: 0644]
DataAccess/IDatabaseFactory.php [new file with mode: 0644]
DataAccess/Queries/QueryBuilder.php
config/DI.php

index 9944116..692763b 100644 (file)
@@ -3,28 +3,20 @@
 namespace DataAccess\DataMapper;\r
 \r
 use Domain\Entities\IDivineEntity;\r
+use DataAccess\IDatabaseFactory;\r
 use DataAccess\DataMapper\IDataMapper;\r
 use DataAccess\Queries\IQueryBuilder;\r
 use DataAccess\DataMapper\Helpers\AbstractPopulationHelper;\r
 use ReflectionClass;\r
-use PDO;\r
 \r
 class DataMapper implements IDataMapper\r
 {\r
     private $_db;\r
     private $_maps;\r
     \r
-    public function __construct($maps, $dbCredentials)\r
+    public function __construct($maps, IDatabaseFactory $databaseFactory)\r
     {\r
-        $credentials = include $dbCredentials;\r
-        //TODO: should probably do all this through a configuration object or something\r
-        $dsn = 'mysql:host=localhost;dbname=divinelegy;charset=utf8';\r
-        $username = 'root';\r
-        $password = 'toor';\r
-        $options = array(PDO::ATTR_EMULATE_PREPARES => false,\r
-                         PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION);\r
-        \r
-        $this->_db = new PDO($dsn, $credentials['user'], $credentials['pass'], $options);        \r
+        $this->_db = $databaseFactory->createInstance();        \r
         $this->_maps = include $maps;\r
     }\r
     \r
diff --git a/DataAccess/DatabaseFactory.php b/DataAccess/DatabaseFactory.php
new file mode 100644 (file)
index 0000000..c3a1146
--- /dev/null
@@ -0,0 +1,30 @@
+<?php
+
+namespace DataAccess;
+
+use DataAccess\IDatabaseFactory;
+
+use PDO;
+
+class DatabaseFactory implements IDatabaseFactory {
+    
+    private $_username;
+    private $_password;
+    private $_dsn;
+    
+    public function __construct($dbCredentials)
+    {
+        $credentials = include $dbCredentials;
+        //TODO: should probably do all this through a configuration object or something
+        $this->_dsn = $credentials['dsn'];
+        $this->_username = $credentials['user'];
+        $this->_password = $credentials['pass'];
+    }
+    
+    public function createInstance()
+    {
+        $options = array(PDO::ATTR_EMULATE_PREPARES => false,
+                         PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION);
+        return new PDO($this->_dsn, $this->_username, $this->_password, $options);
+    }
+}
diff --git a/DataAccess/IDatabaseFactory.php b/DataAccess/IDatabaseFactory.php
new file mode 100644 (file)
index 0000000..5b0522c
--- /dev/null
@@ -0,0 +1,7 @@
+<?php
+
+namespace DataAccess;
+
+interface IDatabaseFactory {
+    public function createInstance();
+}
index 9cfa58f..da9bcbc 100644 (file)
@@ -10,11 +10,11 @@ class QueryBuilder implements IQueryBuilder
     
     protected $_whereClauses = array();
     protected $_limitClause;
-    protected $_joinClause;
+    protected $_joinClauses = array();
     
     public function buildQuery()
     {        
-        $this->applyJoinClause()
+        $this->applyJoinClauses()
              ->applyWhereClauses()
              ->applyLimitClause();
         
@@ -47,13 +47,17 @@ class QueryBuilder implements IQueryBuilder
     
     public function join($type, $tableA, $columnA, $tableB, $columnB)
     {
-        $this->_joinClause = sprintf(' %s JOIN %s ON %s.%s = %s.%s', $type, $tableB, $tableA, $columnA, $tableB, $columnB);
+        $this->_joinClauses[] = sprintf(' %s JOIN %s ON %s.%s = %s.%s', $type, $tableB, $tableA, $columnA, $tableB, $columnB);
         return $this;
     }
     
-    private function applyJoinClause()
+    private function applyJoinClauses()
     {
-        $this->_queryString .= $this->_joinClause;
+        foreach($this->_joinClauses as $joinClause)
+        {
+            $this->_queryString .= $joinClause;
+        }
+        
         return $this;
     }
     
index 4ba7524..2061c4f 100644 (file)
@@ -17,7 +17,9 @@ return [
     \r
     //DA\r
     'DataAccess\StepMania\ISimfileRepository' => DI\object('DataAccess\StepMania\SimfileRepository'),\r
+    'DataAccess\IDatabaseFactory' => DI\object('DataAccess\DatabaseFactory')\r
+        ->constructor(DI\link('db.credentials')),\r
     'DataAccess\DataMapper\IDataMapper' => DI\object('DataAccess\DataMapper\DataMapper')\r
-        ->constructor(DI\link('datamapper.maps'), DI\link('db.credentials')),\r
+        ->constructor(DI\link('datamapper.maps')),\r
     'DataAccess\Queries\IQueryBuilderFactory' => DI\object('DataAccess\Queries\QueryBuilderFactory')\r
 ];\r