Coming from Symfony
This page is for developers who build with Symfony. Many Exponential concepts have a Symfony counterpart, a few do not, and there is a Symfony-based Exponential product line if you want to stay in Symfony entirely. Read it with the concept dictionary at hand.
Contents
- What maps directly
- What works differently
- Habits to keep, habits to drop
- Your first week
- Staying in Symfony
What maps directly
| Symfony | Exponential 6 | Page |
|---|---|---|
public/index.php, Kernel::handle() | index.php, ezpKernel with ezpKernelWeb | The request lifecycle |
kernel.request, kernel.response listeners | request/input listeners, response/output filters | Events and listeners |
bin/console, #[AsCommand] | bin/php/console, Exponential\Runnable\Command | Command line |
bundles, config/bundles.php | extensions, ActiveExtensions[] | Packages |
APP_ENV, when@prod | EXP_ENV, settings variants | Environments |
| Messenger | expqueue | Queues |
| Translation component | .ts catalogues, i18n operator | Translations |
| Web profiler | Exp debug bar | Debugging |
What works differently
| Symfony | Exponential 6 | Page |
|---|---|---|
| DependencyInjection container, autowiring | no container; handler classes named in INI, factories | Dependency injection |
| Routing component, attribute routes | /<module>/<view> declared in module.php; URL aliases for content | Routing |
Controllers returning Response | module views returning a $Result array | Controllers |
Twig with extends and blocks, auto-escaping | the template language with overrides, |wash by hand | The view layer |
| Doctrine entities and migrations | content classes; eZPersistentObject; .dba schema files | ORM, Migrations |
| Form component | templates, module actions, ezformtoken | Forms |
| Security: firewalls, voters | login handlers, roles and policies stored as data | Authorization |
| YAML configuration | INI files in layers | Configuration |
| HttpCache, ESI | role-aware HTTP cache, Velocity response cache; no ESI | HTTP caching |
Habits to keep, habits to drop
Keep: thin controllers with logic in services, constructor parameters for testability, PHPUnit, environment-specific configuration, never committing secrets, one command per deploy step.
Drop: looking for a container to register services in; expecting auto-escaping; writing an entity and a migration for
something editors manage (make it a content class); configuring the same value in five layers without checking
exp:ini where; assuming a fresh process per request (Velocity keeps workers, as RoadRunner would).
Your first week
- Install a development copy (
./console exp:install --apply) and read Exponential for web framework developers. - Day two: The request lifecycle, Siteaccesses, Configuration.
- Day three: Task: build a small CRUD module.
- Day four: The content model for ORM users and Template resolution.
- Day five: Servers and deployment and Testing.
Staying in Symfony
If your project must be a Symfony application, two routes exist:
- Exponential Platform DXP is a Symfony-only CMS, built like any Symfony project (The platform products).
- The legacy bridge runs Exponential 6 inside a Symfony platform project, so editors keep the legacy administration while you write Symfony code and Twig (The Symfony legacy bridge).
Related pages
- Coming from Laravel
- Mixing Exponential and a framework
- Ten pitfalls for framework developers
- Free documentation: this page is free to copy, translate and improve under the GNU FDL 1.3.
Become an Exponential Partner
Partners share their information, provide funding, contribute back and develop the products with us, and that is how Exponential grows. A partner website and dashboard are planned for mid-2027: please become a partner today to speed up our growth rate and land new features faster.