我正在创建一个API,我有一个名为Service
的类,它有一个函数requireType()
$type
是GET
,PUT
,POST
或DELETE
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种标题类型中的任何一种的代码。
答案 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并抛出异常。