2015-06-16 37 views
0

試圖找到最佳解決方案。我有一個表單需要兩個輸入:input1和input2。我使用JavaScript來驗證這些字段 - 只要其中一個填寫正確無誤。php處理多個API調用

目前,我有以下PHP(除去包含)

if (isset($_POST["input1"]) && !empty($_POST["input1"])){ 
    $input1 = $_POST["input1"]; 
    $connection = new APIConnection1(); 
    $response = $connection->obtainResponse($input1); 
} 

if (isset($_POST["input2"]) && !empty($_POST["input2"])){ 
    $input2 = $_POST["input2"]; 
    $connection = new APIConnection2(); 
    $response = $connection->obtainResponse($input2); 
} 

因此,如果輸入1有數據 - APIConnection1被調用。 如果input2有數據 - APIConnection2被調用。 如果它們都有有效的數據 - 兩個API都被調用。所以每個輸入都有自己的API(不同)。

這是我的問題。我現在有第三個API,可以稱之爲APIConnection3。如果爲input1返回的響應爲true,則需要將input1發送到APIConnection3。同樣適用於input2。

問題是,我不能在上面的if語句中真正地調用這些調用,因爲它會分別調用APIConnection3。所以我需要以某種方式執行上面的if語句,然後將整個數據發送到APIConnection3。

因此,如果同時輸入1和輸入2返回true,我想打一個電話,這將是

APIConnection3($input1, $input2); 

如果只有一個返回true,那麼就應該是這樣的

APIConnection3($input1); 

那麼我會如何處理這個問題呢?

謝謝

回答

1

我會使用PHP函數「call_user_func_array()」,它接受控制器,方法和參數的建議。

所以你可以做這樣的事情:

$params = array(); 

if (isset($_POST["input1"]) && !empty($_POST["input1"])) { 
    $input1 = $_POST["input1"]; 
    $connection = new APIConnection1(); 
    $response1 = $connection->obtainResponse($input1); 
    array_push($params, $response1); 
} 
if (isset($_POST["input2"]) && !empty($_POST["input2"])) { 
    $input2 = $_POST["input2"]; 
    $connection = new APIConnection2(); 
    $response2 = $connection->obtainResponse($input2); 
    array_push($params, $response2); 
} 

$controller = new APIConnection3(); 
$response = call_user_func_array(array($controller, "obtainResponse"), $params); 
+0

那是真正有用的,作品充滿了想象。一個奇怪的事情,但。在我的obtainResponse函數中,我嘗試循環參數數組。它抱怨說它爲foreach()提供了一個無效參數。我在這裏錯過了什麼嗎? –

+0

參數作爲單個變量傳遞,因此您的函數應該會有0到2個參數。所以你可以像這樣聲明方法:obtainResponse($ response1 = null,$ response2 = null)。我編輯了答案,因此params數組應該包含response1和/或response2。 – eselskas

1

有幾十種方法可以做到這一點。這裏是一個(我省略了大部分代碼,因爲您的問題更多地是關於邏輯):

if(CASE_01 || CASE_02) { 
    if(CASE_01 && CASE_02) { 
     //Both Inputs... 
    } 
    else if(CASE_01) { 
     //Only Input 1... 
    } 
    else { 
     //only input 2... 
    } 
} 
1

您可以使用CURL來實現。請檢查這些捲曲功能 curl_multi_add_handle(),curl_multi_exec()和curl_multi_getcontent()

創建像多線程(單一功能),並輸入2的值通過輸入1到這個功能,創建的請求循環[你的情況將是2]執行使用curl_multi_getcontent你會得到導致兩個API,如

$master = curl_multi_init(); 

for($i = 0; $i < $node_count; $i++) 
{ 
     $curl_arr[$i]  = curl_init(); 
     curl_setopt($curl_arr[$i], CURLOPT_URL, $apiturl); 
      curl_multi_add_handle($master, $curl_arr[$i]); 


} 
do { 
    curl_multi_exec($master,$running); 
    usleep(10000); 
} while($running > 0); 


for($i = 0; $i < $node_count; $i++) 
{ 

    $results[$i] = curl_multi_getcontent ($curl_arr[$i] ); 
} 
/* check result*/ 
print_r($results); 
2

當您添加更多的投入,你的代碼將更加難以擴展,這就是在設計模式變得得心應手。

例如工廠方法:

$inputs = new array(); 

if (isset($_POST["input1"]) && !empty($_POST["input1"])){ 
    $input1 = $_POST["input1"]; 
    $connection = new APIConnection1(); 
    $response = $connection->obtainResponse($input1); 
    $inputs[0] = $input1; 
} 

if (isset($_POST["input2"]) && !empty($_POST["input2"])){ 
    $input2 = $_POST["input2"]; 
    $connection = new APIConnection2(); 
    $response = $connection->obtainResponse($input2); 
    $inputs[1] = $input2; 
} 

//Call for each input 
$connection = new APIConnection3(); 
foreach ($inputs as $input) 
{ 
    $response = $connection->obtainResponse($input); 
}