placidapp/placid-php
Official PHP SDK for the Placid creative automation API. Generate images, videos, and PDFs from templates by merging dynamic data, then retrieve rendered assets through a simple client for Laravel or any PHP app.
What this package actually is. placidapp/placid-php is not a Laravel package — it is a thin, framework-agnostic PHP SDK that wraps the Placid SaaS REST API (automatic image generation from templates hosted in Placid's editor). There is no service provider, no facade, no config publishing, and no queue or filesystem integration. In Laravel terms it is a library you instantiate yourself and wrap in your own binding.
Architecture fit. Low coupling, which is good: the SDK is a transport detail, not an architectural commitment. The real architectural dependency is the Placid service (templates, rendering, asset hosting, quota), not this code. That means adoption should be framed as a vendor decision with an SDK convenience layer attached — and the convenience layer is replaceable with Http::withToken(...) in roughly the same number of lines.
Integration feasibility. Straightforward. Composer install, API token in .env/config/services.php, a singleton binding, and a service class that calls the SDK. Realistically 1–2 days for a spike and 3–5 days to productionise a first use case (job, storage, retries, observability). No database migrations, no front-end surface, no breaking changes to existing code paths.
Technical risk.
^6|^7 or similar. Laravel 10/11 and other packages push Guzzle 7; a narrow constraint could block upgrades or force --ignore-platform-reqs hacks. Verify composer.json constraints against the target Laravel version first — this is a five-minute check that can kill the option outright.Key questions before proceeding.
Stack fit. PHP + Composer + Guzzle is a native fit for Laravel; the only mismatch is the absence of Laravel packaging conventions. Treat the SDK as an adapter, not a foundation.
Recommended wrapper pattern. Define an application-owned contract — e.g. ImageRenderer::render(TemplateRef $template, array $params): RenderedImage — and implement it once with the SDK. Bind it in a service provider, configure the token via config/services.php and .env. This gives us (a) a single seam to swap in raw Http calls if the SDK rots, (b) a seam to add a second provider, and (c) testability via a fake implementation. Given the maturity signals, plan for the direct-HTTP fallback as the likely medium-term state; the SDK buys us maybe a day of endpoint plumbing.
Migration path. Greenfield addition — no migration of existing data. If we already generate images elsewhere (GD/Imagick, Cloudinary, Bannerbear), migrate one template at a time behind the contract and compare output before cutover. Storage targets (S3/local) and URL rewriting should live in our code, not the SDK.
Compatibility checks (do these first). composer require in a scratch branch; resolve against the pinned Laravel/Guzzle set; confirm PHP 8.2/8.3 support; confirm the SDK doesn't drag in a conflicting PSR-7 or HTTP client version.
Sequencing.
createImage call against a scratch template. Kill criteria: dependency conflict, API drift, or auth/render failure not resolvable in a day.Maintenance. Two maintenance surfaces: the vendor SaaS (their responsibility, with a commercial SLA) and this SDK (ours, de facto). Given a single 2022 release and 10 stars, assume we may need to fork or replace the SDK; the wrapper contract makes that a contained change rather than a refactor. Budget a periodic (quarterly) check that the SDK still matches the live API, plus an owner on our side.
Support. Primary support channel is Placid's commercial support; there is effectively no community to lean on for the SDK itself. Internal runbook needed for: token rotation, quota exhaustion, template deletion, and render failures. Escalation path to the vendor should be documented before launch, not after an incident.
Scaling. Scaling characteristics are dictated by the vendor, not the package: API rate limits, per-image latency (typically hundreds of ms to a few seconds), and metered cost. Design implications — always render off the request path (queued job), cache aggressively by template_id + params hash, and pre-render where the catalogue is bounded. Watch for N+1 renders in list views; that is where cost and latency blow up. Our side scales trivially (stateless HTTP calls).
Failure modes.
Ramp-up. Low. Any Laravel developer can be productive in half a day; the package is small and the API surface is narrow. The genuinely new knowledge is operational (quota, template lifecycle, cost per render) and sits with the product owner as much as engineering.
Recommendation. Proceed only after the dependency-resolution and live-API spike confirms viability. Adopt behind an application-owned interface, with direct HTTP calls as a documented fallback and a second-provider exit option priced into the business case. Do not let this package become load-bearing infrastructure.
How can I help you explore Laravel packages today?