Я делаю пакет php и хочу, чтобы конечные пользователи использовали API вроде:
$package = new Package($key)
$orders = $package->orders()->all();
$products = $package->products()->all();
Моя структура выглядит следующим образом:
src
├── Api
│ ├── ApiClient.php
│ ├── Orders.php
│ └── Products.php
└── Package.php
Package.php берет мой ключ в конструкторе и затем вызывает API для получения токена. Это сохраняется в защищенной переменной внутри объекта, и объект возвращается обратно со всей необходимой информацией, поэтому мне не нужно снова проходить аутентификацию в скрипте.
У меня вопрос: как я могу эффективно получить доступ к методам внутри Orders.php, Products.php из входного файла с моим желаемым API?
Что-то вроде следующего приводит меня туда, но это грязно, когда вы начинаете добавлять во многие классы. Я также чувствую, что повторяю много кода, особенно когда имеется несколько переменных и зависимостей конструктора.
public function orders() : Orders
{
return new Orders($this->token);
}
Я довольно часто вижу использование класса отражения и / или __call магических методов, однако они не обеспечивают никакого автозавершения в среде IDE, которое мне действительно не нравится.
protected function getApiInstance($method)
{
$class = "\\My\\Namespace\\Api\\".ucwords($method);
if (class_exists($class) && ! (new ReflectionClass($class))->isAbstract()) {
return new $class($this->key);
}
}
Какие-нибудь советы о том, как этого добиться?