2014-01-16 19 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中看到与每种方法相对应的方法调用。但这是一个偏好。