我有一个关于“建模,训练”课程的问题,有两个简单的规则不适合我的头脑,这样的训练应该提供,
在我的模型中,无论是'CustomersModel,VehicleModel‘i’都必须能够访问查询编写者(SQLBuilder)的方法,但也可以访问数据库,这不会在映射器在工作台上工作时设置映射器,而不是在映射器上设置银行,因此我的情况有点复杂。
设想以下情况:
<?php
// database access, mapping
abstract class Mapper { }
abstract class Model { }
interface Connection { } // to recognize it's a database access
class MySQL implements Connection { }
class PgSQL implements Connection { }
// SQL Helper, some methods to write a update, insert, delete, select query
class SQLBuilder { }
// my custom models
class Customers extends Model { }可视化这种结构,即“Customers”,已经可以访问映射器,在这种情况下,我将在Customers表中拥有一个属性“$_table”(以及其他属性),以识别该模型可以工作,但是。我不能访问查询的编写者,而不能访问数据库。为此,我想到了一种方法“main()”,其中setaria连接数据库,使用'setDatabaseConnection ( Connection $connection )‘,但是代码经常重复,想象一下N个模型都使用-> setDatabaseConnectiom,而整个应用程序只使用一个数据库?
我的问题基本上是,提供对数据库的访问,而不使用模型(Customers, Vehicle)中的setter方法,以及查询的编写者。
我不想用的方式是..。
<?php
// my models
class Customers extends Model {
// method of mapper does'nt implement
public function getByCity ( $city ) {
$query = $this->select()->from($this->_table)->where('city = ?', $city);
$resultSet = $this->getConnection()->query( $query );
if ( $resultSet->rowCount() > 1 ) {
return $resultSet->fetchAll();
} else return $resultSet->fetch();
}
}那么我如何使用save (),delete (),update ()这个映射器。在这种情况下,getConnection ()方法必须获得默认连接,并返回类。
发布于 2011-12-14 22:09:05
有几种方法可以处理这件事。您可以有一个工厂类来实例化您的Model类。在以下几个方面:
class ModelLoader {
public function load($name)
{
$class = new $name();
$class->setConnection(/* set connection class */);
return $name;
}
}
$loader = new ModelLoader();
$customer = $loader->load('Customer');另一种方法可以是在未设置模型类中的连接时设置要使用的默认连接。
interface Connection {}
class MySQL implements Connection {}
class PgSQL implements Connection {}
abstract class Model {
private $connection = null;
private static $defaultConnection;
public function setConnection(Connection $connection = null)
{
if ($connection === null) {
if (!self::$defaultConnection instanceof Connection) {
throw new Exception('Default connection missing.');
}
$connection = self::$defaultConnection;
}
$this->connection = $connection;
return $this;
}
public function getConnection()
{
if ($this->connection === null) {
$this->setConnection();
}
return $this->connection;
}
public static function setDefaultConnection(Connection $connection)
{
self::$defaultConnection = $connection;
}
}
class Customers extends Model { }
class Vehicle extends Model { }
Model::setDefaultConnection(new MySQL);
$customer = new Customers();
$customer->getConnection();
$vehicle = new Vehicle();
$vehicle->setConnection(new PgSQL);
echo '<pre>';
var_dump($customer);
var_dump($vehicle);
// output
object(Customers)#2 (1) {
["connection":"Model":private]=>
object(MySQL)#1 (0) {
}
}
object(Vehicle)#3 (1) {
["connection":"Model":private]=>
object(PgSQL)#4 (0) {
}
}希望这能有所帮助
https://stackoverflow.com/questions/8475933
复制相似问题