.cursor/skills/saloon-development/SKILL.md
Use this skill when working with SaloonPHP features:
Use web-search for docs at https://docs.saloon.dev. Check composer.json for version (v2, v3 or v4).
saloon:connector, saloon:request, saloon:response, saloon:plugin, saloon:auth. Example:php artisan saloon:connector GitHub GitHubConnector
php artisan saloon:request GitHub GetUserRequest
Saloon\Http\Connector. Example:use Saloon\Http\Connector;
class GitHubConnector extends Connector
{
public function resolveBaseUrl(): string
{
return 'https://api.github.com';
}
}
Saloon\Http\Request, set $method via Saloon\Enums\Method. Example:use Saloon\Enums\Method;
use Saloon\Http\Request;
class GetUserRequest extends Request
{
protected Method $method = Method::GET;
public function resolveEndpoint(): string
{
return '/user';
}
}
$response = $connector->send(new GetUserRequest);
$response->json(); // Array
$response->successful(); // Bool
Body Types: Implement HasBody + trait (HasJsonBody, HasFormBody, HasMultipartBody, HasXmlBody, HasStringBody, HasStreamBody).
Authentication: Use TokenAuthenticator, BasicAuthenticator, QueryAuthenticator, or implement Saloon\Contracts\Authenticator.
Plugins: Built-in traits: AcceptsJson, AlwaysThrowOnErrors, HasTimeout, HasRetry, HasRateLimit, WithDebugData, CastsToDto.
Middleware: Use middleware()->onRequest() and middleware()->onResponse(), or implement boot() method.
DTOs: Implement createDtoFromResponse() in request classes, use $response->dto() or $response->dtoOrFail().
Laravel Facade: Mock requests in tests. Example:
Saloon::fake([GetUserRequest::class => MockResponse::make(['name' => 'Sam'])]);
config/saloon.php:'default_sender' => \Saloon\Laravel\HttpSender::class,
v3 Retry: Set $tries, $retryInterval, $useExponentialBackoff on connectors/requests.
v3 Pagination: Requires saloonphp/pagination-plugin.
Store classes in app/Http/Integrations/{ServiceName}/ (configurable in config/saloon.php).
HasBody interface when sending body dataSaloon\Enums\Method)HttpSender config for TelescopeUse web-search with these docs for specific topics: