Реальность такова: у тебя есть старый сервис, который давно работает, и новое 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 — это паттерн про выживание проекта. Два несовместимых мира склеиваются без ковыряния старого кода, контроллеры дергают интерфейс, а адаптер решает все проблемы совместимости.
0 комментариев