laravel/forge-sdk
Official Laravel Forge SDK for PHP: an expressive client for the Forge API to list and manage servers, sites, and services. Instantiate with an API token, fetch resources, and perform actions like creating servers with provider, region, size, and PHP/database options.
Installation:
composer require laravel/forge-sdk
Add your Forge API token to your .env or configuration:
FORGE_TOKEN=your_forge_api_token_here
First Use Case: Initialize the SDK in a service provider or command:
$forge = new Laravel\Forge\Forge(config('forge.token'));
Fetch all servers to verify connectivity:
$servers = $forge->servers();
Key Starting Points:
Provisioning:
$server = $forge->createServer([
'provider' => ServerProviders::DIGITAL_OCEAN,
'name' => 'api-server',
'size' => '02',
'region' => 'nyc1',
]);
Tip: Use $server->waitForReady() to block until provisioning completes.
Bulk Operations:
foreach ($forge->servers() as $server) {
if ($server->size === '01') {
$server->update(['size' => '02']);
}
}
Git Deployment Pipeline:
$site = $forge->site($serverId, $siteId);
$site->installGitRepository(['repository' => 'git@github.com:user/repo.git']);
$site->deploySite(); // Triggers a deployment
Post-Deploy Hooks:
$forge->executeSiteCommand($serverId, $siteId, [
'command' => 'php artisan queue:work --daemon',
]);
$db = $forge->database($serverId, $dbId);
$db->createUser(['name' => 'app_user', 'password' => 'secure123']);
$db->grantUserAccess(['user_id' => $userId, 'database_id' => $dbId]);
$template = $forge->createNginxTemplate($serverId, [
'name' => 'custom-php-fpm',
'content' => file_get_contents('nginx.conf'),
]);
$forge->updateSiteNginxFile($serverId, $siteId, $template->content);
Laravel Artisan Commands: Create a command to manage Forge resources:
php artisan forge:create-server --name=blog --size=01
Example Command:
$forge = resolve(Forge::class);
$forge->createServer($this->option('parameters'));
Event Listeners: Trigger actions on Forge webhook events (e.g., deployment success):
public function handle(DeploymentSucceeded $event) {
$forge->executeSiteCommand($event->serverId, $event->siteId, [
'command' => 'php artisan optimize:clear',
]);
}
Service Providers: Bind the SDK as a singleton:
$this->app->singleton(Forge::class, function ($app) {
return new Forge(config('forge.token'));
});
Error Handling: Wrap SDK calls in try-catch blocks:
try {
$forge->createSite($serverId, $params);
} catch (TimeoutException $e) {
Log::error("Site creation timed out: " . $e->getMessage());
// Retry logic or notify admin
}
Async Operations:
createSite() default to waiting for completion. Set $wait = false for non-blocking calls but handle follow-ups manually.$forge->setTimeout(300) for long-running operations (e.g., large server provisioning).Resource IDs:
$forge->server($id)). Invalid IDs throw NotFoundException.$server = $forge->servers()->firstWhere('name', 'api-server');
Rate Limiting:
$attempts = 0;
while ($attempts < 3) {
try {
$forge->createDatabase($params);
break;
} catch (RateLimitException $e) {
sleep(2 ** $attempts);
$attempts++;
}
}
State Inconsistencies:
updateSite() or createServer(), refresh the resource to sync local state:
$site->update($params);
$site = $forge->site($serverId, $site->id); // Refresh
SSH Key Management:
$forge->revokeAccessToServer($serverId);
$forge->deleteSSHKey($serverId, $keyId);
Enable Debug Logging: Configure the SDK’s HTTP client to log requests:
$forge = new Forge($token, [
'http_client' => new \GuzzleHttp\Client([
'debug' => fopen('forge_debug.log', 'w'),
]),
]);
Inspect Raw API Responses:
Use getLastResponse() to debug failed requests:
try {
$forge->createSite($params);
} catch (\Exception $e) {
$response = $forge->getLastResponse();
Log::error("API Response: " . $response->getBody());
}
Common Exceptions:
InvalidArgumentException: Invalid parameters (e.g., unsupported PHP version).ForgeException: Generic Forge API errors. Check the response body for details.Custom Resource Models: Extend SDK classes to add methods. Example:
class CustomSite extends Laravel\Forge\Resources\Site {
public function enableMaintenanceMode() {
$this->update(['maintenance_mode' => true]);
}
}
Webhook Integration: Use Forge’s webhooks to trigger Laravel events. Example:
// In your webhook handler
$forge = new Forge($token);
$event = $forge->events()->firstWhere('type', 'site.deployed');
event(new SiteDeployed($event->server_id, $event->site_id));
Local Testing: Mock the SDK for unit tests:
$forgeMock = Mockery::mock(Laravel\Forge\Forge::class);
$forgeMock->shouldReceive('createSite')->andReturn($siteMock);
$this->app->instance(Forge::class, $forgeMock);
Configuration Overrides: Override default SDK settings (e.g., timeout) via DI:
$forge = new Forge($token, [
'timeout' => 600, // 10 minutes
'base_uri' => 'https://forge.example.com/api', // Custom Forge instance
]);
Batch Fetching: Reduce API calls by fetching related resources in bulk:
$server = $forge->server($serverId);
$sites = $forge->sites($serverId); // Fetches all sites for this server
Caching: Cache server/site lists if they rarely change:
$servers = Cache::remember('forge.servers', 300, function () {
return $forge->servers();
});
Parallel Operations:
Use Laravel’s parallel helper for independent tasks:
parallel([
fn() => $forge->createSite($serverId, $params1),
fn() => $forge->createDatabase($serverId, $params2),
]);
How can I help you explore Laravel packages today?