saloonphp/laravel-plugin
Laravel plugin for Saloon that brings tight framework integration: service container bindings, config publishing, artisan tooling, and convenient HTTP client setup for building and managing API connectors and requests cleanly within Laravel apps.
Installation:
composer require saloonphp/laravel-plugin
Publish the configuration:
php artisan vendor:publish --provider="Saloon\Laravel\PluginServiceProvider"
Generate a Connector:
php artisan saloon:connector Stripe
This creates a StripeConnector class in app/Integrations/Connectors/StripeConnector.php.
Define a Request:
php artisan saloon:request Stripe GetPaymentMethods
Generates a request class in app/Integrations/Requests/Stripe/GetPaymentMethodsRequest.php.
Use the Request:
use App\Integrations\Requests\Stripe\GetPaymentMethodsRequest;
$response = GetPaymentMethodsRequest::send();
First Use Case: Quickly scaffold a fully typed API client for Stripe (or any API) with authentication, retries, and response validation built-in.
config/saloon.php for integration paths, default connectors, and middleware settings.saloon:list, saloon:request, and saloon:connector for scaffolding.tests/ directory in the package for integration patterns.saloon:connector to create a base connector (e.g., StripeConnector).saloon:request and specify HTTP methods (GET, POST, etc.).// app/Integrations/Connectors/StripeConnector.php
public function resolveBaseUrl(): string
{
return 'https://api.stripe.com/v1';
}
public function defaultHeaders(): array
{
return [
'Authorization' => 'Bearer ' . $this->apiKey,
];
}
shouldBeValid() for automatic response validation.// app/Integrations/Requests/Stripe/GetPaymentMethodsRequest.php
public function resolveEndpoint(): string
{
return '/payment_methods';
}
public function shouldBeValid(): array
{
return [
'data' => [
'*' => [
'id' => 'required|string',
'type' => 'required|string',
],
],
];
}
config/saloon.php or per-connector.RetryMiddleware, JsonParseMiddleware) or create custom ones.// config/saloon.php
'middleware' => [
\Saloon\Http\Middleware\JsonParseMiddleware::class,
\Saloon\Http\Middleware\RetryMiddleware::class,
],
Saloon::fake() to mock API responses in tests.// tests/Feature/StripeIntegrationTest.php
public function test_get_payment_methods()
{
Saloon::fake([
GetPaymentMethodsRequest::class => Http::response([
'data' => [['id' => 'pm_123', 'type' => 'card']],
]),
]);
$response = GetPaymentMethodsRequest::send();
$this->assertEquals('pm_123', $response->data[0]['id']);
}
Observers or middleware.// app/Providers/AppServiceProvider.php
public function boot()
{
Saloon::observe(function ($request, $response) {
\Log::info('API Call', [
'request' => $request->toArray(),
'response' => $response->toArray(),
]);
});
}
$this->app->bind(
StripeConnector::class,
fn ($app) => new StripeConnector($app['config']['services.stripe.key'])
);
GetPaymentMethodsRequest::dispatch();
public function shouldBeValid(): array
{
return [
'data' => [...],
];
}
public function onSuccess($response)
{
event(new PaymentMethodsFetched($response));
}
// StripeConnector.php
public function resolveBaseUrl(): string
{
return config('services.stripe.api_version') === 'v2'
? 'https://api.stripe.com/v2'
: 'https://api.stripe.com/v1';
}
Integration Path Configuration:
integrations_path in config/saloon.php is misconfigured, generated classes may appear in the wrong directory.app/Integrations (default) or adjust accordingly.
'integrations_path' => app_path('Integrations'),
Middleware Registration:
NightwatchMiddleware (for monitoring) may register multiple times if not guarded.shouldRegister() method in middleware to avoid duplicates.Sensitive Data Handling:
config/services.php or environment variables:
public function defaultHeaders(): array
{
return [
'Authorization' => 'Bearer ' . config('services.stripe.key'),
];
}
Deprecated Methods:
Saloon::fake() with MockClient is deprecated in v3+. Use the global mock client instead.Saloon::fake([GetPaymentMethodsRequest::class => Http::response(...)]);
PHP 8.5+ Compatibility:
@php version directives or update dependencies.Enable Verbose Logging:
SALOON_DEBUG=true in .env to log raw requests/responses.Contract Validation Errors:
shouldBeValid() fails, check the response structure and adjust the validation rules.dd($response->toArray()) to inspect the raw response.Network Issues:
public function resolveRetryMiddleware(): array
{
return [];
}
IDE Support:
ide.json file provides hints for PHPStorm/VSCode. Ensure it’s loaded in your IDE.Custom Middleware:
Saloon\Http\Concerns\HasMiddleware to add logic (e.g., request signing, headers).SignatureMiddleware for HMAC-authenticated APIs.Dynamic Endpoints:
resolveEndpoint() dynamically based on request data:
public function resolveEndpoint(): string
{
return "/users/{$this->userId}";
}
Webhook Handling:
public function shouldBeValid(): array
{
return [
'event' => 'required|string',
'data' => 'required|array',
];
}
Testing Utilities:
SaloonTestCase for reusable test setups:
use Saloon\Testing\SaloonTestCase;
class StripeTest extends SaloonTestCase
{
protected function setUp(): void
{
Saloon::fake([...]);
}
}
Laravel Boost Integration:
saloon-development skill to enforceHow can I help you explore Laravel packages today?