基本的には以前と同じように機能しますが、 a の代わりに aZend_Db_Table_Gateway
を使用するだけです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
)
)