Как правильно выстроить зависимость между Контроллером, Методом и Клиентом?

Добрый вечер ситуация у меня следующая: У меня есть маршрут

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' => 'Внешний сервис не ответил вовремя, попробуйте позже.']
            ];
        }
    }
}

Подскажите как мне правильно реализовать цепочку, а то я сам если честно в тупике ;(


Ответы (0 шт):