ddeboer/salesforce-client-bundle
Installation:
composer require ddeboer/salesforce-client-bundle
(Note: While deprecated, this package remains functional for legacy projects.)
Configuration:
Add to config/bundles.php:
return [
// ...
Ddeboer\SalesforceClientBundle\DdeboerSalesforceClientBundle::class => ['all' => true],
];
Basic Usage: Inject the client in a service:
use Ddeboer\SalesforceClientBundle\Client\SalesforceClientInterface;
class MyService {
public function __construct(private SalesforceClientInterface $client) {}
}
First API Call:
$result = $this->client->query("SELECT Id, Name FROM Account LIMIT 10");
$records = $result->getRecords();
Resources/doc/ in the package// Simple query
$results = $this->client->query("SELECT Id, Name FROM Account");
$records = $results->getRecords();
// Paginated results (for large datasets)
$iterator = $this->client->createQueryIterator("SELECT Id FROM Account");
foreach ($iterator as $record) {
// Process each record
}
Use BulkSaver to batch operations (avoids API limits):
$bulkSaver = $this->client->getBulkSaver();
$bulkSaver->upsert('Account', [
['Name' => 'Acme Corp', 'External_Id__c' => 'EXT123'],
['Name' => 'Globex', 'External_Id__c' => 'EXT456'],
]);
$bulkSaver->execute();
Automatically converts Salesforce UTC times to your local timezone:
$record = $this->client->query("SELECT Id, CreatedDate FROM Account LIMIT 1")->getRecords()[0];
$createdDate = $record->CreatedDate; // Localized datetime
Extend functionality with events (e.g., logging, error handling):
# config.yml
ddeboer_salesforce_client:
events:
query: ['App\EventListener\SalesforceQueryLogger']
SalesforceClientInterface.try {
$this->client->query("INVALID_QUERY");
} catch (\Ddeboer\SalesforceClientBundle\Exception\SalesforceException $e) {
// Handle error (e.g., log, retry)
}
config/packages/ddeboer_salesforce_client.yaml:
ddeboer_salesforce_client:
client:
username: 'user@example.com'
password: 'password'
security_token: 'token'
timezone: 'America/New_York'
Deprecation Warning:
phpforce/salesforce-bundle. Migrate if possible.SOAP Complexity:
SOAP_VAR_ENCODING for complex types:
$this->client->create('Account', ['Name' => 'Test'], SOAP_VAR_ENCODING);
Bulk API Limits:
BulkSaver) have separate limits (check Salesforce Bulk API docs).$bulkSaver->checkStatus();
Timezone Mismatches:
timezone in config matches your app’s timezone. Debug with:
$this->client->getClient()->getLastRequestHeaders()['SOAPAction'];
Enable Logging:
ddeboer_salesforce_client:
client:
logging: true
Logs appear in var/log/salesforce_client.log.
Inspect Raw SOAP: Use a tool like SoapUI to compare requests/responses with the bundle’s output.
Common Errors:
| Error | Cause | Fix |
|---|---|---|
INVALID_LOGIN |
Wrong credentials | Check username, password, token |
MALFORMED_QUERY |
Syntax error in SOQL | Validate query in Salesforce Dev Console |
API_LIMIT_EXCEEDED |
Too many calls | Use BulkSaver or implement retry logic |
FIELD_INTEGRITY_EXCEPTION |
Invalid field value | Check field constraints in Salesforce |
Custom Events:
query, create, or update:
// src/EventListener/SalesforceLogger.php
class SalesforceLogger implements EventSubscriberInterface {
public static function getSubscribedEvents() {
return [
'ddeboer_salesforce.query' => 'onQuery',
];
}
public function onQuery(QueryEvent $event) {
// Log query details
}
}
Override Services:
// src/DependencyInjection/Compiler/SalesforcePass.php
public function process(ContainerBuilder $container) {
$definition = $container->findDefinition('ddeboer_salesforce.client');
$definition->addMethodCall('setCustomConfig', ['key' => 'value']);
}
Mapper Bundle Integration:
DdeboerSalesforceMapperBundle to map Salesforce objects to PHP classes:
/** @Mapper\Entity(class="App\Entity\Account") */
class AccountMapper {
public function hydrate(SalesforceObject $obj, Account $entity) {
$entity->setName($obj->Name);
}
}
LIMIT and pagination (nextRecordsUrl) for large datasets.$this->client->query("SELECT Id, (SELECT Id FROM Contacts) FROM Account");
BulkSaver.How can I help you explore Laravel packages today?