它基本上和你以前做的一样工作,只是Zend_Db_Table_Gateway
你使用 a而不是 a My_UserGateway_Whatever
,例如首先创建一个接口:
interface UserGateway
{
/**
* @return array
* @throws UserGatewayException
*/
public function findAll();
}
我们不希望来自具体网关的异常出现在消费代码中,因此我们将 UserGatewayException 添加为全部:
class UserGatewayException extends RuntimeException
{}
然后添加一个实现该接口的类:
class My_UserGateway_Webservice implements UserGateway
{
public function findAll()
{
try {
// insert logic to fetch from the webservice
return $userData;
} catch (Exception $e) {
throw new UserGatewayException($e->getMessage(), $e->getCode, $e);
}
}
// … more code
}
同样,如果你想使用数据库源,你可以为 Zend_Db_* 类编写一个适配器,例如
class My_UserGateway_Database implements UserGateway
{
private $tableDataGateway;
public function __construct(Zend_Db_Table_Abstract $tableDataGateway)
{
$this->tableDataGateway = $tableDataGateway;
}
public function findAll()
{
try {
return $this->tableDataGateway->select()->blah();
} catch (Exception $e) {
throw new UserGatewayException($e->getMessage(), $e->getCode, $e);
}
}
// … more code
}
如果您需要另一个数据提供者,请确保他们实现了该接口,以便您可以依赖该findAll
方法。使您的消费类依赖于接口,例如
class SomethingUsingUsers
{
private $userGateway;
public function __construct(UserGateway $userGateway)
{
$this->userGateway = $userGateway;
}
public function something()
{
try {
$users = $this->userGateway->findAll();
// do something with array of user data from gateway
} catch (UserGatewayException $e) {
// handle Exception
}
}
// … more code
}
现在,当您创建时,SomethingUsingUsers
您可以轻松地将一个或另一个网关注入到构造函数中,无论您使用哪个网关,您的代码都可以正常工作:
$foo = SomethingUsingUsers(
new My_UserGateway_Database(
new Zend_Db_Table('User')
)
)
或者,对于 Web 服务:
$foo = SomethingUsingUsers(
new My_UserGateway_Webservice(
// any additional dependencies
)
)