Fala, Rafael.
Sobre o norte, recomeondo estudar bastante sobre orientação a objetos, boas práticas, SOLID, Object Calisthenics, Elegant Objects, etc.
Um exemplo simples:
Você teria uma interface UserRepository
:
interface UserRepository
{
/** @return User[] */
public function getEnrolledUsers(): array;
// ... outros métodos necessários
}
E teria a implementação via API:
class ApiUserRepository
{
private HttpClientAdapter $client;
public function __construct(HttpClientAdapter $client)
{
$this->client = $client;
}
public function getEnrolledUsers(): array
{
// Mapeia um array de arrays para um array de objetos do tipo User
$users = array_map(fn ($userAsArray) => $this->hidrateUser($user), $this->client->get('url/users');
foreach ($user as $user) {
$courses = $this->httpClient->get("url/courses/{$user->id()}");
$user->addCourses($courses);
}
return $users;
}
}
Obviamente esse pequeno pedaço de código é só de exemplo e possui inúmeros pontos de melhoria.
Se nem sempre você precisar dos cursos de um aluno, esse código desperdiça recursos.
Além disso, você pode utilizar algum cliente HTTP (como Guzzle, ReactPHP ou curl_multi_init) que permita fazer múltiplos requests simultâneos, assim você ganharia muito tempo.
Além dessas pequenas modificações, ainda recomendaria criar uma classe UserList
para representar uma lista de usuários ao invés de utilizar arrays puros.