maillotf/salesforce-bridge-bundle
A Symfony bundle that bridges your application with Salesforce, simplifying integration so you can connect services, sync data, and work with Salesforce APIs from a familiar PHP/Symfony setup.
Architecture fit — primary finding: this is not a Laravel package. Release 1.0 of maillotf/salesforce-bridge-bundle is a Symfony bundle. It ships a Symfony DI extension, YAML configuration under a salesforce: root key in framework.yaml, and service wiring in services.yaml. A Laravel application has no mechanism to load a Symfony bundle: there is no service provider, no config/salesforce.php publishable config, no facade, no env-var mapping, and no auto-discovery. The headline for any TPM evaluating this against a Laravel codebase is that installation is not the integration — a port is.
What is reusable. The underlying SalesforceService (e.g. getBySobjectId()) appears to be a plain PHP service with a response object exposing isSuccess(). If it does not depend on Symfony-specific container or HTTP abstractions, the class is extractable and bindable in Laravel's container in a few hours. Everything around it — config loading, credential wiring, service aliasing — must be rebuilt.
Integration feasibility.
--ignore-platform-reqs trades a clean failure for a runtime failure.services.yaml alias (SalesforceService: '@salesforce.service') is illustrative rather than a complete wiring example, and the controller sample mixes a capitalised variable with PSR-12 style — a signal that the docs were not exercised against a fresh skeleton.Authentication — the material risk. The package uses the Salesforce username–password + security token OAuth flow. Salesforce has been actively restricting this flow: it is disabled by default for newly created connected apps and is not an approved pattern for new integrations. It also ties the integration to a human user account, so a password change, a security token reset, MFA enforcement, or a login IP range change breaks production silently. The supported alternatives (JWT bearer flow with a certificate, or client credentials for server-to-server) are not offered.
API version. The sample configuration pins rest.version: "v35.0", a Salesforce API version from roughly 2016. Salesforce retires API versions on a rolling basis; anything near v35 is past or approaching end of support. It is configurable, but the documented default is a strong signal the package has not tracked the platform in years.
Credential handling. Client secret, user password, and security token are all expected in plaintext YAML committed to the repository. There is no secret-manager integration, no key-rotation path, and no indication of redaction in logs. This is likely to fail a security review and can block procurement in regulated environments.
General maturity signals. Version 1.0 with a single maintainer, no changelog, no stated semantic-versioning policy, no visible test suite or CI configuration, no security disclosure contact, and no license information in the notes. There is no evidence of a bulk API, SOQL pagination, retry/backoff, or rate-limit handling.
Key questions to resolve before any commitment.
SalesforceService depend on Symfony's HttpClient or on Guzzle/PHP streams — i.e. is it extractable at all?REQUEST_LIMIT_EXCEEDED, or a session-limit error — is there typed error handling or does it throw raw exceptions?Stack fit verdict. Poor, as-is. Symfony 4 + PHP 7 is two major framework generations and two language minor versions behind a current Laravel stack. Treat this as a reference implementation, not a dependency.
Options, in order of preference.
Http::fake(), and a supportable upgrade path. This is the default recommendation.config/salesforce.php driven by env vars, facade for convenience, replacement of the auth layer with JWT bearer, API version bumped to a currently supported release, retry/backoff and structured logging (credential redaction mandatory), and a test suite against a mocked HTTP layer. Estimate two to four engineer-weeks including tests, plus an ongoing maintenance owner.getBySobjectId in a throwaway project, confirm the auth flow works against a sandbox org, and record the result. Do not deploy.Migration path (if option 2). Extract the service class and its response object → replace Symfony DI with a Laravel container binding → move YAML keys to config + env → swap auth to JWT bearer with a certificate in the secret manager → bump API version → add retry/backoff and logging → publish behind our own SalesforceClient interface so the vendor can be swapped later without touching call sites.
Compatibility matrix to pin explicitly. PHP version, Laravel major, Symfony components we transitively rely on, and Salesforce API version. Salesforce API versions are the sneaky one — a version bump on their side can break us with no change on ours.
Sequencing.
getBySobjectId) in one low-risk feature, then expand to writes only after error handling and rate-limit behaviour are understood.Maintenance. If we fork, we own it permanently — upstream will not track Laravel releases, PHP releases, or Salesforce API retirements. Even without a fork, adopting this means owning a dependency with no observable maintenance signal. Budget an explicit ongoing allocation rather than assuming the community absorbs it.
Support. Single maintainer, no SLA, no stated security contact, no changelog. Assume issues go unanswered and plan for internal ownership of every defect. There is no vendor to escalate to, which makes this a materially different risk profile from a commercial SDK.
Scaling. Three constraints bite as volume grows:
Failure modes to instrument for.
REQUEST_LIMIT_EXCEEDED under load.Ramp-up. For a Symfony developer, low: two YAML blocks and one injected service. For a Laravel team, high. There is no Laravel documentation, no service provider to register, no config to publish, and no example of SOQL, pagination, or error handling. Onboarding means reading the bundle source to determine what is actually safe to call. Assume one to two days of source reading before the first confident integration, and note that the team will be reverse-engineering behaviour the README does not describe.
Governance. Plaintext user credentials in configuration is very likely to fail a security review outright, independent of the technical merits. Route this past security and compliance before any engineering time is spent, because a rejection there invalidates the build-vs-buy analysis entirely.
How can I help you explore Laravel packages today?