Как правильно выстроить зависимость между Контроллером, Методом и Клиентом?
Добрый вечер ситуация у меня следующая: У меня есть маршрут
Route::post('anime', [
\App\Http\Controllers\R\AnimesController::class, 'index'
//\App\Services\Api\Methods\R\Animes\GetAnime::class, '__invoke'
])->name('.anime');
который цепляет контроллер
class AnimesController extends Controller
{
/** Точка входа */
public function index(RRequest $request)
{
$method = '_' . $this->convertFromUnderScoreInCamelCase($request->getAction());
if ( method_exists($this, $method) )
{
return call_user_func([$this, $method], $request);
}
return new JsonResponse([
'error' => ['code' => 404, 'message' => 'Action not exist.']
],404);
}
private function _getAnime(RRequest $request)
{
$rr = new GetAnime($request); <- Вот здесь проблемы, он запрашивает $client, а по задумке должен отправлять данные с реквеста
// $t = \App\Services\Api\Methods\Animes\GetAnime::class;
// return new $t($request);
}
}
контроллер в свою очередь цепляет метод сервиса:
class GetAnime
{
private RClient $client;
public function __construct(RClient $client)
{
$this->client = $client;
}
public function __invoke(RRequest $request): JsonResponse
{
$id = $request->getId();
$endpoint = "animes/{$id}";
$response = $this->client->call($endpoint);
if ( !is_object($response) && isset($response['error']) ) return new JsonResponse($response, 200);
$payload = $response;
return new JsonResponse([
'id' => $payload->id,
'category' => 'animes',
'urn' => [
'item' => "animes/{$payload->id}",
'poster' => strstr($payload->image->original,'?',true)
],
'titles' => [
'name' => $payload->name,
'ru' => $payload->russian,
'en' => $payload->english,
'jp' => $payload->japanese,
'synonyms' => $payload->synonyms,
],
'type' => $payload->kind,
'episodes' => [
'count' => $payload->episodes,
'duration' => $payload->duration,
],
'date' => [
'aired_on' => $payload->aired_on,
'released_on' => $payload->released_on,
],
'rating' => $payload->rating,
'description' => $payload->description,
'genres' => $payload->genres,
'studios' => $payload->studios
]);
}
}
Вот класс самого сервиса для http запроса к стороннему ресурсу:
class RClient
{
private Http $http;
private string $host;
public function __construct(Http $http)
{
$this->http = $http;
$this->host = config('r.api_host');
}
final public function call(string $endpoint)
{
$url = $this->host . $endpoint;
try
{
$response = $this->http::get($url);
$payload = $response->object();
if ( $response->status() !== 200 ) return [
'error' => ['code' => $response->status(), 'message' => $payload->message]
];
return $payload;
}
catch (Throwable $e)
{
return [
'error' => ['code' => $e->getCode(), 'message' => 'Внешний сервис не ответил вовремя, попробуйте позже.']
];
}
}
}
Подскажите как мне правильно реализовать цепочку, а то я сам если честно в тупике ;(