saloonphp/laravel-plugin
Laravel plugin for Saloon that adds first-class Laravel integration: config publishing, service provider bindings, facades, Artisan tooling, and convenient client setup. Makes using Saloon HTTP connectors and requests feel native inside Laravel apps.
Installation
composer require saloonphp/laravel-plugin
Publish the config (optional):
php artisan vendor:publish --provider="Saloon\Laravel\SaloonServiceProvider"
First Use Case: HTTP Client
Define a connector (e.g., GitHubConnector):
use Saloon\Contracts\Connector;
use Saloon\Saloon;
class GitHubConnector extends Connector
{
protected string $baseUrl = 'https://api.github.com';
protected string $tokenName = 'github_token';
}
Register it in config/saloon.php:
'connectors' => [
'github' => [
'class' => \App\Connectors\GitHubConnector::class,
],
],
First Request
use Saloon\Laravel\Facades\Saloon;
$response = Saloon::connect('github')->call(new GetUserRequest('octocat'));
$user = $response->json();
GetUserRequest):
use Saloon\Contracts\Request;
class GetUserRequest extends Request
{
public function resolveEndpoint(): string
{
return '/users/' . $this->username;
}
}
GetUserResponse):
use Saloon\Contracts\Response;
class GetUserResponse extends Response
{
public function resolve(): array
{
return $this->data['data'];
}
}
tokenName in connector):
protected string $tokenName = 'github_token'; // Fetches from Laravel config
use Saloon\Contracts\Middleware;
class LogRequestMiddleware implements Middleware
{
public function handle($request): void
{
\Log::info('Request:', $request->toArray());
}
}
Register in config/saloon.php:
'middleware' => [
\App\Middleware\LogRequestMiddleware::class,
],
use Saloon\Laravel\Facades\Saloon;
class UserService
{
public function __construct(private Saloon $saloon) {}
public function fetchUser(string $username)
{
return $this->saloon->connect('github')->call(new GetUserRequest($username));
}
}
use Saloon\Contracts\Cache;
class CacheMiddleware implements Middleware
{
public function handle($request): void
{
$cacheKey = 'github_user_' . $request->username;
if (cache()->has($cacheKey)) {
$request->response = cache()->get($cacheKey);
}
}
}
$connector = new GitHubConnector();
$connector->mockResponse(new GetUserResponse(['id' => 123]));
$response = $connector->call(new GetUserRequest('octocat'));
it('fetches a user', function () {
$connector = new GitHubConnector();
$connector->mockResponse(new GetUserResponse(['login' => 'octocat']));
$response = $connector->call(new GetUserRequest('octocat'));
expect($response->login)->toBe('octocat');
});
Token Management:
tokenName in the connector matches a key in config/services.php (e.g., github.token).config/saloon.php and config/services.php alignment.Response Parsing:
resolve() in the response class.class XmlResponse extends Response
{
public function resolve(): array
{
return json_decode(json_encode(simplexml_load_string($this->body)), true);
}
}
Middleware Order:
CacheMiddleware after LogMiddleware to avoid logging cached responses.config/saloon.php.Rate Limiting:
throttle middleware or a custom Saloon middleware.class RateLimitMiddleware implements Middleware
{
public function handle($request): void
{
if ($request->connector->rateLimitExceeded()) {
throw new \Exception('Rate limit exceeded');
}
}
}
Saloon::debug(); // Logs all requests/responses to Laravel logs.
$response = Saloon::connect('github')->call(new GetUserRequest('octocat'));
\Log::info('Raw:', $response->raw());
Custom Connectors:
Saloon\Connector for non-HTTP protocols (e.g., WebSocket).class WebSocketConnector extends Connector
{
protected function sendRequest(): void
{
// Custom WebSocket logic
}
}
Dynamic Config:
$connector = new GitHubConnector();
$connector->setBaseUrl('https://api.github.com/v3'); // Override dynamically
Event Listeners:
saloon.request and saloon.response events:
Saloon::listen(function ($request) {
\Log::info('Request fired:', $request->method);
});
Saloon::batch() for parallel calls:
$responses = Saloon::batch([
new GetUserRequest('octocat'),
new GetUserRequest('laravel'),
]);
$connector = new GitHubConnector();
$response1 = $connector->call(new GetUserRequest('octocat'));
$response2 = $connector->call(new GetRepoRequest('laravel'));
How can I help you explore Laravel packages today?