From 29fa6424d83ad74712663a9ed307020d8c8abf5c Mon Sep 17 00:00:00 2001 From: Cameron Ball Date: Wed, 24 Sep 2014 16:45:44 +0800 Subject: [PATCH] Better DI for database. --- DataAccess/DataMapper/DataMapper.php | 14 +++----------- DataAccess/DatabaseFactory.php | 30 ++++++++++++++++++++++++++++++ DataAccess/IDatabaseFactory.php | 7 +++++++ DataAccess/Queries/QueryBuilder.php | 14 +++++++++----- config/DI.php | 4 +++- 5 files changed, 52 insertions(+), 17 deletions(-) create mode 100644 DataAccess/DatabaseFactory.php create mode 100644 DataAccess/IDatabaseFactory.php diff --git a/DataAccess/DataMapper/DataMapper.php b/DataAccess/DataMapper/DataMapper.php index 9944116..692763b 100644 --- a/DataAccess/DataMapper/DataMapper.php +++ b/DataAccess/DataMapper/DataMapper.php @@ -3,28 +3,20 @@ namespace DataAccess\DataMapper; use Domain\Entities\IDivineEntity; +use DataAccess\IDatabaseFactory; use DataAccess\DataMapper\IDataMapper; use DataAccess\Queries\IQueryBuilder; use DataAccess\DataMapper\Helpers\AbstractPopulationHelper; use ReflectionClass; -use PDO; class DataMapper implements IDataMapper { private $_db; private $_maps; - public function __construct($maps, $dbCredentials) + public function __construct($maps, IDatabaseFactory $databaseFactory) { - $credentials = include $dbCredentials; - //TODO: should probably do all this through a configuration object or something - $dsn = 'mysql:host=localhost;dbname=divinelegy;charset=utf8'; - $username = 'root'; - $password = 'toor'; - $options = array(PDO::ATTR_EMULATE_PREPARES => false, - PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION); - - $this->_db = new PDO($dsn, $credentials['user'], $credentials['pass'], $options); + $this->_db = $databaseFactory->createInstance(); $this->_maps = include $maps; } diff --git a/DataAccess/DatabaseFactory.php b/DataAccess/DatabaseFactory.php new file mode 100644 index 0000000..c3a1146 --- /dev/null +++ b/DataAccess/DatabaseFactory.php @@ -0,0 +1,30 @@ +_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 index 0000000..5b0522c --- /dev/null +++ b/DataAccess/IDatabaseFactory.php @@ -0,0 +1,7 @@ +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; } diff --git a/config/DI.php b/config/DI.php index 4ba7524..2061c4f 100644 --- a/config/DI.php +++ b/config/DI.php @@ -17,7 +17,9 @@ return [ //DA 'DataAccess\StepMania\ISimfileRepository' => DI\object('DataAccess\StepMania\SimfileRepository'), + 'DataAccess\IDatabaseFactory' => DI\object('DataAccess\DatabaseFactory') + ->constructor(DI\link('db.credentials')), 'DataAccess\DataMapper\IDataMapper' => DI\object('DataAccess\DataMapper\DataMapper') - ->constructor(DI\link('datamapper.maps'), DI\link('db.credentials')), + ->constructor(DI\link('datamapper.maps')), 'DataAccess\Queries\IQueryBuilderFactory' => DI\object('DataAccess\Queries\QueryBuilderFactory') ]; -- 2.11.0