我正在使用API构建一个应用程序,API是Yii框架中的独立模块。
我需要一种方法可以直接在应用程序中访问 API,并同时像内部 API 一样使用它;如果应用程序中不存在该模块,我想在服务器中调用服务并获得响应,没有代码重复。
我有一个解决方案,但我不喜欢它,因为代码是重复的。这是我的解决方案。
类控制器 A
<?php
class controllerA{
public function actionIndex(){
$a = new A();
$a->x();
$b = new B();
$b->x();
$c = new C();
$c->x();
}
A类
<?php
class A{
public function x(){
API_A::getInstance()->x();
}
public function Z(){
API_A::getInstance()->Z();
}
}
B类
<?php
class B{
public function x(){
API_B::getInstance()->x();
}
public function Z(){
API_B::getInstance()->Z();
}
}
接口类:
B类
<?php
class API_B{
public function x(){
// CODE HERE
}
public function Z(){
// CODE HERE
}
}
在此类问题中,最好的方法是在控制器中使用准系统代码。这意味着在控制器部分,您将包括
- 清理用户输入,可以在本地或通过导入功能进行。
- 将合法输入传递给导入的函数,该函数是
- 将内部函数的输出格式化为 JSON (etc) 并输出。
现在,问题出现了在哪里保留内部功能。它可能是模型的一部分,但我不喜欢这样,因为我倾向于使用 gii 一次又一次地重新生成模型。
一个好方法是创建组件,我通常最终会为每个 API 控制器创建一个组件,有时甚至是跨多个控制器的共享组件,具体取决于应用程序大小。
下面是控制器操作代码示例
public function actionProcess1(){
$input = appcomponentsvalidator::sanitize(Yii::$app->request->post(),"model");
$output = appcomponentsprocessor::process1($input['var1'],$input['var2']);
appcomponentsformatter::getJson($output);
}