Я создаю приложение с 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();
}
Класс А
<?php
class A{
public function x(){
API_A::getInstance()->x();
}
public function Z(){
API_A::getInstance()->Z();
}
}
Класс б
<?php
class B{
public function x(){
API_B::getInstance()->x();
}
public function Z(){
API_B::getInstance()->Z();
}
}
Классы API:
Класс б
<?php
class API_B{
public function x(){
// CODE HERE
}
public function Z(){
// CODE HERE
}
}
Наилучший подход к решению подобных проблем — иметь в контроллере код barebone. Это означает, что в части контроллера, вы будете включать
Теперь возникает вопрос, где сохранить внутренние функции. Это может быть частью модели, но я не предпочитаю этого, потому что я склонен регенерировать модели снова и снова, используя gii.
Хорошим способом является создание компонентов, обычно я делаю один компонент на контроллер API или иногда даже общий компонент для нескольких контроллеров в зависимости от размера приложения.
Ниже приведен пример кода действия контроллера
public function actionProcess1(){
$input = \app\components\validator::sanitize(Yii::$app->request->post(),"model");
$output = \app\components\processor::process1($input['var1'],$input['var2']);
\app\components\formatter::getJson($output);
}
Других решений пока нет …