2014-01-16 62 views
1

切入追逐:我的應用程序將使用cURL調用一個API。然而,這個API需要保密,所以我使用框架來創建我自己的API來查詢外部API。我已經這樣做了,但它確實很麻煩,而且是不好的編碼 - 所以我想盡我所能做好這件事,爲了我自己的學習。瞭解面向對象的編程 - 我可以改進什麼?

我第一次創建我interface

interface APICall { 

    /** 
    * Return data from the API 
    * @returns json 
    */ 
    public function callData($method, $parameters); 

} 

我然後創建我的類,它會做捲曲(將只是做一個GET請求現在):

class curl { 

    private static $apiUrl = 'http://api.somewebsite.com/v1/'; 

    public function __construct() { 

     if (!function_exists('curl_init')) 
      exit('CURL is not installed!'); 

    } 

    public function getCurl($method, $parameters) { 

     $url = self::$apiUrl . $method . '?' . $parameters; 

     $ch = curl_init(); 
     curl_setopt($ch, CURLOPT_URL, $url); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
     $output = curl_exec($ch); 
     curl_close($ch); 

     return $output; 

    } 

    // Another function for a POST request could go here 

} 

好了,現在我會爲每個特定呼叫創建我的課程,例如「獲取用戶列表」:

class users extends curl implements APICall { 

    /** 
    * Get list of users 
    */ 

    public function callData($method, $parameters) { 

     $this->getCurl($method, $parameters); 

    } 

} 

好了 - 現在我不能完全肯定這將工作(集思廣益現在),但我知道我還會有一些問題:

  1. 在我的捲曲類__construct,我不認爲這不應該包含一個「檢查是否安裝了cURL」的檢查 - 但是最佳去哪裏?

  2. 我在curl類的每個方法中構建了$url--這看起來很糟糕,因爲我最終會重複這個 - 但是我在哪裏創建了要使用的?

  3. 我感覺好像在用$method & $parameters很頻繁,這是正常的嗎?

很抱歉,如果這是相當多的,只是想了解它作爲我當前編碼的做法都是扯淡!

+0

如果使用cURL,它肯定會確保它需要的東西存在。至少,定義類的文件應該檢查​​。儘管如此,它不應該「退出」。它可能應該拋出異常。 – cHao

+1

順便說一句,考慮到這是一個改進工作代碼的請求,它可能會更適合[codereview.se]。這裏的問題通常預計會涉及不起作用的東西。 – cHao

+1

此外,PHP已經有一個內置的方法來執行'$ method'和'$ parameters'。如果您的'callData'函數重命名爲'__call',調用者甚至不必知道該方法是動態的;它可以說'$ obj-> someMethod($ params)'。這使得構建代表底層API的代理對象變得非常容易,而不會讓調用者變得醜陋。 – cHao

回答

1
class curl { 
    private $method; 
    private $parameters; 
    private $url; 

    public function __construct($url,$method,$parameters = array()) { 
     if (!function_exists('curl_init')){ 
      throw new Exception('CURL is not installed!'); 
     } 
     $this -> setUrl($url); 
     $this -> setMethod($method); 
     $this -> setParameters($parameters);   
    } 

    public function setMethod($method){ 
     $this -> method = $method; 
     return $this; 
    } 

    public function getMethod(){ 
     return $this -> method; 
    } 

    public function setParameters(array $parameters){ 
     $this -> parameters = $parameters; 
     return $this; 
    } 

    public function getParameters(){ 
     return $this -> parameters; 
    } 

    public function setUrl($url){ 
     $this -> url = $url; 
     return $this; 
    } 

    public function getUrl(){ 
     return $this -> url; 
    } 

    public function execute() {  
     // add method support, so you don't need an extra POST method 
     $url = $this -> createUrl(); 
     $ch = curl_init(); 
     curl_setopt($ch, CURLOPT_URL, $this -> getUrl()); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
     $output = curl_exec($ch); 
     curl_close($ch); 

     return $output; 
    } 

    private function createUrl(){ 
     return $this -> url . $this -> getMethod() . '?' . http_build_query($this -> getParameters()); 
    } 
} 

您不需要使用構造,但我認爲沒有URL和方法的捲曲是毫無意義的。所以你可以通過將它放入構造函數來創建對url和方法的依賴。添加Setter和Getter支持以從外部改變對象的狀態。您不需要創建不同的執行功能,就足夠了。網址創建的問題也解決了。從外面設置網址。所以你也可以在其他情況下使用捲曲。

試着注入curl類並且不要擴展它。例如:

class specificApi implements ApiInterface { 
    private $curl; 

    public function __construct(Curl $curl){ 
     $this -> curl = $curl; 
    } 

    public function execute(){ 
     return $this -> curl -> setUrl('someUrl') -> setMethod('someMethod') -> execute(); 
    } 
} 

在你認識到,捲曲總是需要一些構造函數的參數,所以你需要創建一個工廠,創建捲曲類下一步。你會注入工廠並在api類中創建一個curl類的實例。

+0

嗯,謝謝你,這樣做更有意義!當你說「//添加方法支持,所以你不需要額外的POST方法」 - 你可以擴展一下嗎? – Alias

1
  1. 要麼在代碼安裝程序(例如,出現,web應用-配置,轉速等),在框架專用/設定的路線,或在該文件的頂部需要時。只在最糟糕的情況下在構造函數中。

  2. 創建一個實現您的接口並擴展的抽象類。或者使用PHP 5.4特徵。

  3. 也許吧。我寧願在您的API中看到與每種方法相對應的方法調用。但這是一個偏好。