1

zend フレームワークで構築されたアプリケーションを開始しています。このアプリケーションは、データベース以外の複数のデータ ソースを利用できる必要があります。たとえば、Web サービス。

このシナリオを可能にするためにモデルを構築する方法について読んでいます。これに対する解決策を提供すると思われるさまざまな概念に出くわしました (DataMapper パターン、サービス パターン、アダプター レイヤーなど)。ただし、これを再利用可能でスケーラブルなコードベースにまとめる方法については、まだ混乱しています。

以前に zend フレームワークを使用したことがあり、通常は mysql テーブルを使用します。たとえば、Users テーブルがあるとします。モデルには、ユーザー ドメインのビジネス ロジックを含む Users クラスと、ユーザー テーブルの行を表す Zend_Db_Table_Row_Abstract を拡張する User クラスがあります。

データソースが何であっても $users->fetchAll() を呼び出してユーザー オブジェクトのコレクションを取得できるように、モデルとコード ベースを整理するにはどうすればよいでしょうか?

4

1 に答える 1

4

基本的には以前と同じように機能しますが、 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
    )
)
于 2012-10-26T11:04:42.197 に答える