Реальность такова: у тебя есть старый сервис, который давно работает, и новое API, которое нельзя трогать. Что делать? Лезть и переписывать старый код? Нет. Берём паттерн Адаптер. Он просто делает два несовместимых интерфейса совместимыми.

В Laravel это особенно удобно для сервисов и интеграций с внешними системами: старый класс остаётся нетронутым, а новый интерфейс спокойно дергает данные через адаптер.

Создание адаптера

Шаг 1: Интерфейсы и старый класс

namespace App\Services;

interface NewApiInterface
{
    public function getData();
}

class OldApiClient
{
    public function fetchData()
    {
        // Старое API, которое уже работает
        return ['old', 'data'];
    }
}

Старый класс уже живёт своей жизнью. Мы не трогаем его.

Шаг 2: Адаптер

namespace App\Services;

class OldApiAdapter implements NewApiInterface
{
    protected $oldApiClient;

    public function __construct(OldApiClient $oldApiClient)
    {
        $this->oldApiClient = $oldApiClient;
    }

    public function getData()
    {
        // Приводим данные к формату нового интерфейса
        return $this->oldApiClient->fetchData();
    }
}

Адаптер берёт старый сервис и делает его “понимаемым” для нового кода.

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

namespace App\Http\Controllers;

use App\Services\NewApiInterface;
use App\Services\OldApiAdapter;
use App\Services\OldApiClient;

class SomeController extends Controller
{
    public function index(NewApiInterface $api)
    {
        $oldApiClient = new OldApiClient();
        $adapter = new OldApiAdapter($oldApiClient);

        return $adapter->getData();
    }
}

Контроллер дергает интерфейс, а адаптер решает проблему несовместимости. Старый клиент остаётся живым и целым.

Практические моменты

  • Совместимость без боли — старый код не трогаем, новый интерфейс работает.
  • Тестируемость — можно мокать адаптер или старый клиент отдельно.
  • Расширяемость — добавил новый старый клиент? Делаешь новый адаптер — контроллеры не меняются.

Почему это реально работает

  • Не ломает существующий код.
  • Добавляет слой абстракции для интеграций.
  • Можно легко вставлять новые клиенты, новые API и старый код при этом остаётся целым.

Вывод

Адаптер в Laravel — это паттерн про выживание проекта. Два несовместимых мира склеиваются без ковыряния старого кода, контроллеры дергают интерфейс, а адаптер решает все проблемы совместимости.