Durable is a PHP library for durable execution: long-running workflows coordinated with Temporal, with a cursor-based event journal, activities for side effects, and replay so workflow code stays deterministic.
This monorepo contains:
| Package | Path | Role |
|---|---|---|
gplanchat/durable |
src/Durable/ |
Core library (workflows, activities, event store, in-memory and integration surfaces) |
gplanchat/durable-bundle |
src/DurableBundle/ |
Symfony bundle (Messenger, configuration, profiler) |
gplanchat/durable-bridge-temporal |
src/Bridge/Temporal/ |
Temporal gRPC bridge (no official Temporal PHP SDK; see DUR006) |
gplanchat/durable-bridge-dbal |
src/Bridge/Dbal/ |
Doctrine DBAL journal + stores: durable execution on one SQL database, no cluster (DUR030) |
gplanchat/durable-bridge-illuminate |
src/Bridge/Illuminate/ |
Illuminate (Laravel) journal + stores on the connection Laravel already owns (DUR030) |
gplanchat/durable-laravel |
src/DurableLaravel/ |
Laravel integration: binds the four storage ports from one published config file, work rides the application's queue |
gplanchat/durable-plugin |
src/DurablePlugin/ |
Sylius 2 admin plugin: workflow dashboard, backend-neutral (DUR037) |
gplanchat/durable-phpstan |
src/DurablePhpstan/ |
PHPStan extension: resolves stub calls against their typed contract |
gplanchat/durable-rector |
src/DurableRector/ |
Rector rules migrating a project off the official Temporal PHP SDK |
| Sample app | symfony/ |
Example Symfony application using the bundle + Temporal |
| Sylius shop | sylius/ |
Sylius 2.2 Standard — where the admin dashboard is rendered for real |
Sylius Standard 2.2 requires PHP 8.3 and an extension set no PHP on a typical dev box carries in one place, so the shop runs on the image the skeleton ships with — never on the host PHP:
cd sylius
cp compose.override.dist.yml compose.override.yml # monte l'app, et `../src` dont elle dépend
docker compose up -d # php 8.3, MySQL 8.4, nginx, mailhog
docker compose run --rm php composer install
docker compose run --rm php bin/console debug:routercomposer.lock is tracked here, unlike in the upstream skeleton: this shop is a test bench in CI,
and an unpinned resolve would let a Sylius release break the build with no commit of ours behind it.
Constraints aligned with project rules: no official Temporal PHP SDK, no RoadRunner as the Durable runtime (DUR006).
- PHP 8.2+
- For Temporal gRPC: ext-grpc (see bridge and sample READMEs)
From the repository root:
composer install
composer testFor the Symfony sample (workers, Docker, PHPUnit):
cd symfony
composer install
composer testSee symfony/README.md for Messenger consumers, DURABLE_DSN, and optional Temporal integration tests.
- Contributor index (ADRs, working agreements):
documentation/INDEX.md - Document lifecycle:
documentation/LIFECYCLE.md - User guide (Markdown source) for Hugo:
documentation/user/— build instructions indocumentation/HUGO.md - Per-package READMEs:
src/Durable/README.md,src/DurableBundle/README.md,src/Bridge/Temporal/README.md - Monorepo → satellite repositories (splitsh):
bin/splitsh-publish.sh, DUR020,.github/workflows/splitsh.yml— pushes tomain/masterand tagsv*propagate to satellites whenSPLITSH_PUSH_TOKENis configured.
Architecture decisions for this component use the DUR prefix under documentation/adr/ (see DUR000).
This project is released under the MIT License (SPDX identifier: MIT). The full text is in LICENSE; distribution policy is described in WA004.