如何强制调用方法

时间:2014-10-03 20:13:48

标签: php

我正在创建一个API,我有一个名为Service的类,它有一个函数requireType()

$typeGETPUTPOSTDELETE

之一
final public function requireType($type){
    // Do some stuff
}

我还有一个名为API的大师类,它创建了一个从API调用的类的实例,然后调用它ClassA,然后扩展Service

class ClassA extends Service{

    // Writer called "$this->requireType()" method is fine to run
    public function myAction(){
        // Make sure $this->requireType() was called here before anything else gets run
        $this->requireType("POST");
        // Do some stuff
    }

    // Writer did not call "$this->requireType()" method
    // An error should occur
    public function myAction(){
        // Do some stuff
    }
}

我想知道的是,在我的API课程中,如何(如果可能)我可以查看requireType()是否立即调用myAction()

API类方法调用看起来像这样(简化):

// This method creates an instance of "ClassA" and runs "myAction()"
// We should check to see if the person who wrote the method "myAction()" 
// called "$this->requireType()" or not. If not throw an Error
final public function execServiceRequest($clientData = ""){
    $class = $this->getService();
    $reflection = new ReflectionMethod($class, $this->action);
    $obj = new $class();
    $obj->setReadWrite($this->read, $this->write);
    $obj->initPage($this->config);
    $obj->setData($clientData);
    $obj->before();
    $response = call_user_func(array($obj, $this->action));
    $obj->after();
}

所以最后我想要这样的事情:

来自example.com的客户端向PUT发送api.example2.com请求,api.example2com知道客户端发送了什么。被调用的方法不知道,需要说你是否要打电话给我需要发送GET请求,如果不需要,你需要发送一个{{1}的不同请求} header以访问此方法。

我主要想添加此功能,因此创建新方法的开发人员不会编写会偶然接受4种标题类型中的任何一种的代码。

2 个答案:

答案 0 :(得分:1)

我会将构造函数放在Service类中:

class Service {
  final public function __construct($type) {
    $this->requireType($type);
  }
}

这样,任何从服务扩展的类都必须用$type构造并调用函数

或者,如果对myAction()的每次调用都有不同的类型很重要,那么您可以在Service类中使用抽象方法和已定义的方法:

abstract class Service {
  final public function myAction($type) {
    $this->requireType($type);
    $this->customAction();
  }
  protected function customAction();
}

这样,每个人都用他们想要的类型调用myAction()(由php强制执行),然后myAction()调用customAction(),这必须在扩展类中定义

答案 1 :(得分:0)

在基本控制器构造函数中,将名为“calledRequireType”的实例变量设置为false。

在requireType中,将calledRequireType设置为true。

在......你要检查它们是否调用它的任何代码(可能是调用xxAction后调用xxAction的相同处理程序),检查calledRequireType并抛出异常。