Passage — легкий API Proxy Gateway для Laravel

0
Перекладено ШІ
Оригінал: Laravel News
Оновлено: 22 квітня, 2026
Пакет Passage дозволяє легко створити проксі-шар для безпечної взаємодії із зовнішніми API безпосередньо у вашому Laravel-додатку. Дізнайтеся, як ефективно керувати автентифікацією та трансформацією даних за допомогою звичного синтаксису маршрутів.

Passage — це Laravel-пакет від Morcen Chavez, який дозволяє вашому застосунку стати посередником між клієнтом і зовнішнім API. Ви зберігаєте повний контроль над автентифікацією, заголовками та трансформацією даних, використовуючи звичну систему роутингу та middleware Laravel.

Типовий сценарій використання: вам потрібно звернутися до стороннього API з фронтенду, але ви не хочете розкривати API-ключі, прагнете нормалізувати дані або централізувати логіку валідації. Замість розробки власного проксі-сервісу з нуля, Passage пропонує структурований підхід із мінімумом шаблонного коду.

# Визначення роутів

Роути реєструються через фасад Passage разом із вашими звичайними маршрутами. Параметр {path?} перехоплює будь-який підшлях і передає його на upstream-сервіс:

use Morcen\Passage\Facades\Passage;
 
Passage::get('github/{path?}', GithubPassageController::class);
Passage::post('stripe/{path?}', StripePassageController::class);
Passage::any('payments/{path?}', PaymentsPassageController::class);

Підтримуються стандартні методи HTTP: get, post, put, patch, delete та any.

# Створення обробника (Handler)

Кожен роут веде до класу-обробника, який керує пересиланням запитів та поверненням відповідей. Створити його можна командою:

php artisan passage:controller GithubPassageController

Обробники наслідують PassageHandler і можуть реалізовувати три методи:

Мінімальний обробник виглядає так:

class GithubPassageController extends PassageHandler
{
    public function getOptions(): array
    {
        return [
            'base_uri' => 'https://api.github.com/',
        ];
    }
 
    public function getRequest(Request $request): Request
    {
        return $this->withBearerToken($request, config('services.github.token'));
    }
}

Зверніть увагу на слеш у кінці base_uri — він необхідний для коректної переадресації шляхів.

# Вбудовані інструменти автентифікації

Passage містить три трейти для роботи з автентифікацією в getRequest():

Також можна згенерувати контролер із уже готовою логікою авторизації:

php artisan passage:controller StripePassageController --with-auth=apikey
php artisan passage:controller PaymentsPassageController --with-auth=hmac

# Безпека

Passage автоматично видаляє конфіденційні заголовки клієнта (cookies, authorization, proxy-authorization) перед пересиланням запиту. Якщо потрібно пропустити певні заголовки, реалізуйте інтерфейс AcceptsClientHeaders і визначте метод allowedClientHeaders() для створення білого списку:

class GithubPassageController extends PassageHandler implements AcceptsClientHeaders
{
    public function allowedClientHeaders(): array
    {
        return ['authorization'];
    }
}

Ви також можете обмежити список хостів для проксіювання, встановивши PASSAGE_ENFORCE_ALLOWED_HOSTS=true у файлі оточення.

# Валідація та стійкість

Обробники можуть перевіряти вхідні запити ще до їхнього відправлення на зовнішній сервіс через інтерфейс ValidatesInboundRequest. Опишіть правила у методі rules(), і в разі помилки Passage поверне статус 422 без запиту до API.

use Morcen\Passage\Contracts\ValidatesInboundRequest;
 
class StripePassageController extends PassageHandler implements ValidatesInboundRequest
{
    public function getOptions(): array
    {
        return ['base_uri' => 'https://api.stripe.com/'];
    }
 
    public function rules(): array
    {
        return [
            'amount'   => ['required', 'integer', 'min:1'],
            'currency' => ['required', 'string', 'size:3'],
        ];
    }
}

Для підвищення надійності метод withRetry() додає автоматичні повторні спроби з експоненціальною затримкою:

class PaymentsPassageController extends PassageHandler
{
    public function getOptions(): array
    {
        return array_merge(
            ['base_uri' => 'https://payments.example.com/'],
            $this->withRetry(3, 200), // 3 спроби, початкова затримка 200мс
        );
    }
}

Passage також підтримує кешування для GET/HEAD роутів та потокову передачу (streaming) великих даних.

# Корисні команди Artisan

Вимкнути проксіювання можна глобально в .env за допомогою PASSAGE_ENABLED=false.


Passage — це елегантне рішення для створення легкого API-проксі всередині Laravel без потреби розгортати складні корпоративні шлюзи. Дізнатися більше та переглянути вихідний код можна на GitHub.

Популярні

Logomark Logotype

Створення CLI-додатка за допомогою Laravel та Docker

Зазирніть у світ Laravel, де потужний CLI-фреймворк відкриває нові можливості для розробки командного інтерфейсу. Дізнайтеся, як створити просту утиліту для перевірки акцій, яка працює з Docker, та які переваги це може принести у вашому проєкті!

Logomark Logotype

Що нового в PHP 8.5

PHP 8.5 обіцяє безліч нових можливостей, таких як оператор Pipe, функції `array_first()` та `array_last()`, а також нове розширення URI. Чи готові ви дізнатися, як ці функції можуть спростити вашу розробку? Читайте далі, щоб дізнатися більше про ці захоплюючі нововведення

Logomark Logotype

Простий пакет RabbitMQ для Laravel

Вам цікаво дізнатися, як спростити інтеграцію RabbitMQ у вашому Laravel-додатку? У нашій статті ми розглянемо пакет Simple RabbitMQ, який дозволяє легко налаштувати багатозʼєднання, публікувати повідомлення та обробляти черги за допомогою простого синтаксису. Читайте далі, щоб дізнатися більше!