用于REST HTTP谓词的PHP __call方法

时间:2015-06-24 17:39:45

标签: php oop php-5.3

我正在编写一个REST包装类,它看起来像:

class RestApi
{
      public function __call($method, $resource, $data = []){
           return $this->call($method, $resource, $data);
      }

      public function call($http_verb, $resource, $data = []){}
}

但是当我尝试运行以下内容时......

$ra = new RestApi();
$ra->post('api/book/index');

它会抛出以下错误......

  

RestApi :: __ call()必须正好使用2个参数

我想摆脱重复代码,所以我决定对所有四个http动词使用__call魔术方法。请建议一个方法。感谢。

1 个答案:

答案 0 :(得分:1)

与错误消息一样,__call魔术方法只需要2个参数:所请求方法的名称,以及传递的参数的数组。所有这些信息都可以找到here

考虑到这一点,也许修改你的代码看起来更像这样:

public function __call($method, $arguments) {
    return $this->call($method, $arguments[0], $arguments[1]);
}

假设您使用CURL实现了实际的API请求(这可能是一个非常大的假设),您可以在call()方法中执行以下操作:

switch (strtoupper($http_verb)) {
    case 'GET':
        // Nothing special happens here, this is CURL's default behavior
        break;
    case 'POST':
        curl_setopt($ch, CURLOPT_POST, true);
        break;
    case 'PUT':
        curl_setopt($ch, CURLOPT_PUT, true);
        break;

    // Etc...
}

这纯粹是一个示例,用于演示您可以使用__call()魔术方法执行的条件逻辑。有许多libraries and frameworks创建REST包装器,就像您尝试做的那样。我建议将其中一个作为学习经验,或者调查像Guzzle这样的库。

注意:当然,使用可选的第二个参数(就像你上面的那个),在盲目地传递它们之前进行一些检查以查看是否存在$arguments[1]等是明智的。否则,您将获得类似PHP Notice: Undefined offset: 1的内容。

<强>更新

关于我的最后一段,@ JayTaph提出了一个很好的建议。一个简洁的方法(一行,不需要额外的检查)将使用以下内容:

public function __call($method, $arguments) {
    return this->call($method, array_shift($arguments), $arguments);
}

如果只传递了一个参数,在第一个元素被array_shift()移开后,$arguments将是一个空数组,这可以避免我上面提到的PHP Notice: Undefined offset错误。