Организация класса Api Wrappers - PullRequest
1 голос
/ 22 марта 2019

Я пытаюсь научиться создавать обертки php для сторонних apis.Однако я запутался в реализации нескольких классов, расширенных / реализованных друг в друге.

class Api {
   protected $username;
   protected $password;
   protected $wsdl = "http://example.com"

   protected $client;
   protected $account;

   public function __construct($username, $password)
   {
       $this->client = new SoapClient($this->wsdl);
       $authData = [
           "Credentials"   => [
               "Username"          => $username,
               "Password"          => $password
           ]
       ];

       $this->makeCall('AuthenticateUser', $authData);
       $this->account = $this->makeCall('GetAccountInfo', ["Authenticator" => $this->authenticator]);
   }

   protected function makeCall($method, $data) {
       $result = $this->client->$method($data);
       $this->authenticator = $result->Authenticator;
       return $result;
   }
}

Пока здесь это не имеет смысла.Однако на данный момент я не хочу добавлять все методы в этом классе.Таким образом, я решил создать отдельный класс для каждого метода.И вот, здесь начинается проблема.

class AddressValidator extends Api
{
    public function validateAddress($data) {
       $response = $this->makeCall('validateAddress', $data);
       dd($response);
    }
}

Логически, как мне нужно вызвать оболочку (в моем контроллере), как это показано ниже, верно?

$api = new Api($username, $password);
$api->validateAddress($params);   // but I can't call this line with this setup

Вместо этого это работает:

$api = new ValidateAddress($username, $password);
$api->validateAddress($params);

Имеет смысл, но разве это хороший способ его организации?

Какой прекрасный способ настройкиAPI-оболочка?Кстати, может быть, я не прав с таким подходом полностью.Я был бы рад услышать, что вы думаете

Ответы [ 2 ]

1 голос
/ 23 марта 2019

Может быть, что-то вроде

class Api {
    private $class;
       .
       .
    public function __construct($username, $password, $class_name) {
        .
        .
        $this->class = new $class_name();
    }

    public function ApiCall($func, ...$arguments) {
        $this->class->$func($arguments);
    }
}

Я не уверен, что это облегчит вам задачу, но это работает.

1 голос
/ 22 марта 2019

Вместо расширения вашего класса API вы можете использовать черту для организации ваших методов.

    class Api {
        use ValidateAddressTrait;

        ...
    }

Черта:

    trait ValidateAddressTrait {
        public function validateAddress($data) {
            $response = $this->makeCall('validateAddress', $data);
            dd($response);
        }
    }

Использование:

    $api = new Api($username, $password);
    $api->validateAddress($params);

Это не совсем цель черты, но я думаю, что она может дать вам результат, который вы ищете.

...