Installation
composer require phpforce/common
Add to composer.json under require if not using autoload.
First Use Case: Salesforce API Requests
use Phpforce\Common\Salesforce\SalesforceConnection;
$connection = new SalesforceConnection([
'clientId' => 'YOUR_CLIENT_ID',
'clientSecret' => 'YOUR_CLIENT_SECRET',
'username' => 'YOUR_USERNAME',
'password' => 'YOUR_PASSWORD+SECURITY_TOKEN',
'loginUrl' => 'https://login.salesforce.com', // or sandbox
]);
$response = $connection->get('/services/data/v56.0/sobjects/Account');
$accounts = $response->getBody();
Key Classes to Explore
SalesforceConnection: Core connection handler.SalesforceResponse: Parse API responses.SalesforceException: Handle errors gracefully.SalesforceRestClient: For REST API operations.Where to Look First
tests/ for edge cases.Authentication Flow
$connection = new SalesforceConnection($config);
$connection->login(); // Explicit login (optional if auto-login is enabled).
CRUD Operations
// Create
$response = $connection->create('/services/data/v56.0/sobjects/Account', [
'Name' => 'Test Account',
'Description' => 'Created via PhpForce',
]);
// Read (Single)
$account = $connection->get('/services/data/v56.0/sobjects/Account/001XXXXXXXXXXXXXXX');
// Update
$connection->update('/services/data/v56.0/sobjects/Account/001XXXXXXXXXXXXXXX', [
'Description' => 'Updated description',
]);
// Delete
$connection->delete('/services/data/v56.0/sobjects/Account/001XXXXXXXXXXXXXXX');
Bulk API (Async Operations)
$bulk = $connection->getBulk();
$job = $bulk->createJob('Account');
$job->addBatch(['Name' => 'Batch 1']);
$job->close();
$job->waitForCompletion();
SOQL Queries
$query = 'SELECT Id, Name FROM Account LIMIT 10';
$response = $connection->query($query);
$results = $response->getBody()->getRecords();
Laravel Service Provider
Bind the connection in AppServiceProvider:
$this->app->singleton(SalesforceConnection::class, function ($app) {
return new SalesforceConnection(config('services.salesforce'));
});
Configuration
Store credentials in .env:
SALESFORCE_CLIENT_ID=your_id
SALESFORCE_CLIENT_SECRET=your_secret
SALESFORCE_USERNAME=user@example.com
SALESFORCE_PASSWORD=pass+token
SALESFORCE_LOGIN_URL=https://login.salesforce.com
Error Handling Wrap API calls in a try-catch:
try {
$response = $connection->get('/services/data/v56.0/sobjects/Account');
} catch (SalesforceException $e) {
Log::error('Salesforce API Error: ' . $e->getMessage());
return response()->json(['error' => 'Salesforce unavailable'], 500);
}
Logging Enable debug logging for troubleshooting:
$connection->setLogger(new Monolog\Logger('salesforce'));
Session Expiry
login() to refresh.SOQL Injection
SalesforceQueryBuilder.Bulk API Limits
waitForCompletion().Rate Limiting
429 Too Many Requests).Case Sensitivity
/services/data/v56.0 vs /services/data/V56.0).Enable Verbose Logging
$connection->setDebug(true); // Logs raw requests/responses.
Common Errors
| Error Code | Cause | Solution |
|---|---|---|
INVALID_SESSION_ID |
Expired session. | Call login() again. |
INVALID_FIELD |
Invalid field name. | Check Salesforce schema or field API name. |
MALFORMED_QUERY |
Invalid SOQL. | Validate query syntax. |
REQUIRED_FIELD_MISSING |
Missing required field. | Include all required fields in payload. |
Custom Response Parsing
Override SalesforceResponse to handle custom response formats:
class CustomResponse extends SalesforceResponse {
public function getCustomData() {
return json_decode($this->body, true)['custom_field'];
}
}
Mocking for Tests
Use SalesforceConnectionMock (if available) or mock HTTP client:
$mockHandler = new \Http\Mock\Handler();
$mockHandler->append(new \Http\Mock\Response(200, [], '{"success": true}'));
$client = new \Http\Adapter\Guzzle6\Client($mockHandler);
$connection = new SalesforceConnection($config, $client);
Extending API Clients Create a wrapper for domain-specific logic:
class AccountService {
protected $connection;
public function __construct(SalesforceConnection $connection) {
$this->connection = $connection;
}
public function createAccount(array $data) {
return $this->connection->create('/services/data/v56.0/sobjects/Account', $data);
}
}
Webhook Handling
For Salesforce Platform Events, extend SalesforceConnection to listen to webhooks:
$connection->subscribeToPlatformEvents('AccountChangeEvent', function ($payload) {
// Handle event.
});
Login URL
https://test.salesforce.com for sandbox environments./services/Soap/u/XX.X (e.g., https://yourdomain.my.salesforce.com).OAuth vs. Username-Password
SalesforceOAuthConnection from phpforce/oauth).API Version
v56.0. Check Salesforce API Versions for compatibility.How can I help you explore Laravel packages today?