2

2つのsimilairAPIを1つのPHPフレームワークに実装するための良い方法は何でしょうか。

私の考えは次のようなものでした:

  • /vendors/wrapperA.php-親を拡張し、APIを実装します(A)
  • /vendors/wrapperB.php-親を拡張し、APIを実装します(B)
  • Parent.php- APIラッパーを使用するために直接参照される唯一のスクリプト
  • Parent.phpで構成するための$config[]配列
  • index.php- Parent.phpを実装し、参照するだけのWebサイト

APIには多くのメソッドがあるとしましょうが、実装するのは2つの単純なAPI呼び出しだけです。

  • connect()-サービスへの接続を作成します。
  • put()-成功した場合は「putID」を返します。

API (A)とAPI (B)は異なるため、これら2つのメソッドを抽象化することにより、ラッパーがそのユーティリティを実装する方法を示します。

さて、私のポイントに:

  • これをPHPで実装するための良い方法は何でしょうか?
  • connect()ステートメントは、有効な接続があることを検証する必要があります。
  • put()ステートメントはIDを返す必要があります
  • putメソッドの違いを明らかにしたくはありません。API認証を正しく構成したかどうかに基づいて機能する必要があります(どのような場合でも、秘密鍵またはその他の方法で)

すなわち

何かのようなもの

<?php $parent = new Parent();
$parent->connect(); //connect to one or both API's.
$parent->put('foo'); //push foo to the API
?>

現在、Parent.phpにすべてのコードがあります。

Parent.phpにすべてのコードがある場合の問題

  1. コードの無秩序な増加
  2. 3番目のAPIを追加する場合のモジュラープラグインの欠如。
  3. コードの混乱-どのAPIがどれですか?

編集:マリンの答えに基づいて考案されたソリューション

<?php 

/*** Interface ***/

interface API_Wrapper {
    function connect();
    function put($file);
} 

/*** API Wrappers ***/
class API_A_Wrapper implements API_Wrapper {
    function connect() {}
    function put($file) { print 'putting to API A.'; }
}

class API_B_Wrapper implements API_Wrapper {
    function connect() {}
    function put($file) { print 'putting to API B.'; }
}

/*** Factory ***/
class Factory {
  public static function create($type){ 
    switch ($type) {
      case "API_A" : 
        $obj = new API_A_Wrapper(); 
      break;
      case "API_B" :
        $obj = new API_B_Wrapper();  
      break;
    }
    return $obj;
   } 

} 

/*** Usage ***/

$wrapperA = Factory::create("API_A");
$wrapperA->put('foo');

$wrapperB = Factory::create("API_B");
$wrapperB->put('foo');
4

2 に答える 2

1

リレーション付きのインターフェースを使用し、必要に応じて個別に呼び出します。

interface Interface {
    function somefunction();
}

class Wrapper1 implements Relation {
    public function connect() {
        return;
    }
}

class Wrapper2 {
    public function action(Interface $s) {
        $textData = $s->query();
        return;
    }
}

$p = new Wrapper1();

$i = new Wrapper2();
$i->action($p);

関係としてファクトリを使用する:

function __autoload($class)
{
    include_once($class . '.php');
}

class DBfactory
{
    public static $pDB;

    public static function factory($szType = "")
    {
    if(!is_object(self::$pDB))
    {
        switch($szType)
        {
            case 'mysql':
                self::$pDB = new DBmysql;
                break;
            case 'mssql':
                self::$pDB = new DBmssql;
                break;
            default:
                self::$pDB = new DBmysql;
                break;
        }
    }
    return self::$pDB;
    }
}  
于 2013-03-04T23:49:20.840 に答える
0

必要なのは、依存関係の注入です。2つのクラスがあります-それらをラッパーと呼びます-それぞれが異なるAPIをカバーしますが、同じインターフェースに準拠する必要があります。Webサイトでは、どちらのクラスも同じように使用したいと考えています。実際には、コードベースの残りの部分、つまり共通のParentインターフェイスに影響を与えることなく、基盤となるAPIを使用します。

ただし、ある時点で、コードで使用するラッパーを決定する必要があります。新しいParent実装を含める場合は、これらの新しいラッパーをコードベースに手動で含める必要があります。

この問題は、依存性注入によって解決されます。アイデアは、専用のオブジェクト(ファクトリ)を使用できるラッパーのすべての詳細をカプセル化することであり、その瞬間のラッパーを必要とするコードのビットは、そのファクトリにそれを要求する可能性があります。明らかに、コードはインターフェイスのファクトリとインスタンスのみを処理する必要がありParentます。

インスタンス化するラッパーをファクトリがどのように決定するかについては、選択する必要があります。多くの場合、コードのどの部分でどのクラスを使用する必要があるかを含む構成ファイルを使用します。これは、ラッパークライアントに関連付けられたID(つまり、それらを使用するコード)を使用して実装でき、クライアントは、ラッパーを要求するときにファクトリにこのIDを与えます。次に、ファクトリはIDを検索し、アドホックインスタンスを提供します。

于 2013-03-05T00:32:57.010 に答える