What Symfony is, and when it fits an enterprise project
Symfony is an open-source PHP framework built as a set of independent, reusable components: routing, dependency injection, event dispatching, HTTP handling, serialization, validation and console tooling. Those components can be used together as a full-stack framework, or adopted individually inside another codebase. Symfony also publishes long-term-support (LTS) releases on a predictable cadence, which is why it is a common choice for systems expected to stay in production for many years.
Symfony fits best when the application carries substantial domain complexity: business rules, workflows, permissions and integrations that outgrow a content-managed site. Typical fits are enterprise web applications, API-first backends for SPA and mobile front-ends, integration and middleware layers between ERP, CRM and legacy systems, event- and queue-driven services, and long-lived regulated systems.
Employee-facing systems are a recurring case. Internal tools, approval workflows, directory and document services sit behind SSO and are often exposed inside an existing intranet rather than as a separate destination. Because Symfony and Drupal share the same component foundation, an organization already running Drupal can extend into custom Symfony applications without changing engineering language, tooling or hosting model.
Where Symfony is not the answer, Metadrop says so during discovery: a content-led site is often better served by Drupal, and a small standalone service may not justify a full framework.
Symfony development services we provide
Custom Symfony application development
Net-new enterprise applications on the current Symfony LTS and PHP 8.3+: customer portals, back-office and workflow systems, marketplaces, and domain-heavy business applications. They are built with Doctrine ORM for the persistence layer, Twig for server-rendered interfaces, and a test suite from the first sprint rather than added afterwards.
API-first backends with API Platform
REST and GraphQL APIs built on API Platform, with JSON-LD/Hydra and OpenAPI documentation generated from the same resource definitions the API is built on. They are the backend for SPA front-ends, mobile apps and system-to-system integrations.
Legacy PHP to Symfony migration
Structured routes off unmaintained custom PHP, an abandoned in-house framework, or an end-of-life PHP version onto a supported Symfony codebase. Migration is phased and test-guarded, designed to keep the current system serving traffic while functionality moves across.
Symfony major-version upgrades
Stepwise upgrades across majors, deprecation-driven and test-guarded, one major at a time, bringing a codebase back onto a supported LTS.
Enterprise integrations
Symfony applications connected to SAP, Salesforce, Microsoft Dynamics, Sharepoint, payment gateways, search engines and custom SOAP/REST back-ends, with queue-backed asynchronous processing where volume requires it.
Architecture consulting and code review
An independent assessment of an existing Symfony or PHP codebase covering service architecture, dependency graph, test coverage, performance profile and upgrade route, delivered as a prioritized roadmap before any code changes.
Maintenance, support and SLA
Long-term ownership of a production Symfony system: security patching, dependency and PHP version upgrades, monitoring, performance tuning and feature evolution under a contractual SLA.
They've Trusted Metadrop
From industrial manufacturers and B2B marketplaces to humanitarian organizations and public bodies, organizations across 50+ countries have relied on Metadrop for PHP, Symfony-component and Drupal engineering.
Working in Symfony's component layer
Drupal is built on Symfony. Every Drupal platform Metadrop has engineered over 15+ years runs on Symfony's HttpKernel, and its custom code is written against Symfony's own component APIs.
The components Metadrop's engineers work in as routine production work include DependencyInjection (service definitions, compiler passes, tagged services), EventDispatcher (subscribers and listeners), HttpKernel and HttpFoundation (the request/response lifecycle and middleware-style logic), Routing, Serializer, Validator and Console, the last one for long-running and scheduled CLI commands.
This work is carried out directly against Symfony's architectural components: the same service-container patterns, event models and CLI tooling that a standalone Symfony application is built from. Standalone Symfony applications, API Platform integrations and Symfony Console tooling have been delivered as extensions of that foundation on client engagements.
Testing and static analysis are part of the engineering practice: PHPUnit, Behat, and static analysis in the pipeline. Metadrop also runs public PHPUnit and TDD training for other engineering teams. Its published engineering writing covers PHP major-version migration, Composer dependency management, mocking third-party APIs in test environments, and automated testing beyond PHPUnit, the same practices this page's upgrade and maintenance work rests on.
Our Symfony technology stack
- Framework and language: Symfony (current LTS and latest), PHP 8.3+, Symfony Flex.
- Data: Doctrine ORM and DBAL, MySQL/MariaDB, PostgreSQL, Redis.
- APIs: API Platform, REST, GraphQL, JSON-LD/Hydra, OpenAPI, OAuth2/OIDC, JWT.
- Async and real-time: Symfony Messenger with RabbitMQ or Redis transports, Mercure.
- Interfaces: Twig, Webpack Encore/Vite, and SPA front-ends in Angular, React or Vue where a rich client is required.
- Search: Solr, Elasticsearch.
- Quality: PHPUnit, Behat, PHPStan, PHP CodeSniffer, Rector, Composer audit.
- Infrastructure and CI/CD: Docker, Kubernetes, AWS, Azure, GitLab CI, GitHub Actions, Jenkins, Varnish, Cloudflare.
New Symfony applications and API-first backends
API Platform generates REST and GraphQL endpoints, OpenAPI documentation and JSON-LD/Hydra output from annotated resources, which shortens the distance between a domain model and a documented, consumable API. On top of it, Metadrop delivers authentication and authorization patterns including OAuth2/OIDC, JWT, SAML SSO, role- and group-scoped permissions, and per-resource access rules.
Symfony Messenger moves heavy or spiky work such as imports, notifications and third-party synchronization off the request cycle and onto queues, while Mercure pushes real-time updates to browsers and apps. APIs are covered by automated contract and integration tests, so a consuming front-end or mobile app can be developed against a stable, verified surface. The deployment target follows the client's own infrastructure policy: AWS, Azure, Google Cloud, or self-hosted Docker/Kubernetes.
On one engagement, Metadrop built an authenticated GraphQL and REST API backend for a global humanitarian organization operating in more than 50 countries, covering CRUD endpoints, group management and invitation-email flows, with automated API test suites over both interfaces.
Legacy PHP migration and Symfony major-version upgrades
Both journeys start with the same deliverable: an audit of the existing codebase covering dependency inventory, deprecation report, test coverage, integration surface and a risk register specific to that code. Upgrades then run one major at a time, driven by the deprecation messages the framework itself emits, an established and incremental discipline rather than running two frameworks side by side in production.
Rector automates the mechanical part of a version bump, PHPStan raises typing and API-change issues as early as possible during delivery, and PHPUnit and Behat suites guard behaviour at every step. Where a legacy codebase has no tests, characterisation tests are written for the critical paths first.
Legacy migrations are phased by bounded slice, one domain area, one integration or one screen family at a time, so the current system keeps serving traffic while functionality moves across. URL structure, redirects and indexed paths are mapped and verified before and after each phase, so search visibility is checked rather than assumed. PHP version migration usually travels with the framework upgrade as well, since a Symfony major jump normally implies a minimum PHP version, and both are planned as one piece of work.
| Where the codebase is now | Typical route | What guards it |
|---|---|---|
| Custom PHP, no framework | Rebuild by bounded slice onto current Symfony LTS, running alongside the legacy system | Characterisation tests on critical paths, phased cutover per slice |
| Abandoned in-house or end-of-life framework | Domain model and data migrated to Symfony + Doctrine; integrations re-implemented as services | Data-migration dry runs on production-equivalent data |
| Symfony 2.x or 3.x | Stepwise through each major to the current LTS | Deprecation reports, Rector rule sets, PHPStan, regression suite per step |
| Symfony 4.x or 5.x | Stepwise to the current LTS, usually with a PHP version bump in the same programme | Same per-step gates, plus dependency and bundle replacement plan |
| Current LTS, no upgrade discipline | Move onto a maintained upgrade cadence under a support retainer | Automated dependency and security scanning in CI |
Metadrop migrated a European sports media publisher's news platform across two major Drupal versions with a custom migration pipeline of 16 coordinated migrations covering users, files, media, taxonomies, content types, redirects and path aliases, with custom process plugins rewriting embedded editor images into managed media references, so content and indexed URLs carried over.
On another engagement, Metadrop carried a global B2B marketplace in the wind-energy sector through consecutive major upgrades, Drupal 7 to 9, then 10, then 11, each jump crossing a Symfony major version, alongside module replacement and multilingual reconfiguration, with the platform live throughout.
Long-term Symfony maintenance and support
Maintenance retainers cover security patching, dependency and PHP version upgrades, monitoring, incident response, performance tuning and feature evolution under one agreement. Response and resolution targets are contractual, agreed per priority level during onboarding rather than described in general terms.
Dependency and vulnerability scanning runs in CI through Composer audit, the PHP security advisories database and Symfony's own security checks, so an advisory becomes a scheduled patch rather than a discovery during an incident. Observability is set up as part of onboarding too: application monitoring, error tracking, profiling and log aggregation, so regressions surface from data rather than from a user report.
Onboarding an inherited or undocumented codebase is a normal starting point. Audit, environment reproduction, bootstrapping an automated test suite, and a documented runbook come before feature work. Client relationships commonly run 3+ years, with the longest active PHP platform engagements past the decade mark. Where possible, continuity of the delivery team helps retain architectural context over time. Where a client wants to take delivery back in-house, knowledge transfer and team training are part of the engagement, handed over as agreed in the contract.
Metadrop maintains and evolves the fundraising and donation platform of an international children's-rights NGO under a relationship running since 2015, including a PHP 8.4 migration covering custom code and the QA toolchain (static analysis and automated tests), recurring-donation and payment-gateway work, and Core Web Vitals performance tuning.
Security, compliance and governance
GDPR-aligned data flows
Prepared for NIS2 requirements
ENS-certified partner
WCAG 2.1 AA for Twig interfaces
Application security baseline
Independent technical governance
What drives the cost of a Symfony project
Four variables move a Symfony budget most: integration count, domain complexity (workflows, permissions, business rules), data-migration volume and quality, and test coverage in the existing codebase. Legacy state matters as much as scope, because an undocumented codebase with no tests carries discovery and characterisation work that a documented one does not. Test coverage is one of the areas that often has the greatest impact on an upgrade timeline.
Metadrop quotes per project after a free consultation rather than publishing a rate card, because rates vary by seniority, engagement model and contract length. A paid audit or discovery phase is available as a standalone first step, producing a scope, risk register and estimate the client owns, with no obligation to continue.
Engagement models
Dedicated team
Staff augmentation
Fixed-price project
Time and materials
flexible delivery at an agreed day rate. Best for evolving scope or discovery work.
Support retainer
How a project runs
Discovery and audit
goals, constraints, integration map, codebase and dependency assessment, risk register.Architecture and roadmap
service architecture, data model, API contract, migration or upgrade route, prioritized backlog.Agile delivery in 2-week sprints
a demo, a retrospective and a visible backlog every sprint, under Metadrop's Scrum and Kanban practice.Quality gates
automated tests, static analysis, security scanning and accessibility checks before each release.Release and handover
deployment pipeline, runbook and documentation.Support and evolution
maintenance under a defined SLA with a planned upgrade cadence.
Frequently asked questions
Is Drupal built on Symfony?
Yes. Since Drupal 8, Drupal has been built on Symfony components, among them HttpKernel, Routing, DependencyInjection, EventDispatcher, HttpFoundation, Serializer, Validator and Console. This is why experience building Drupal platforms also provides experience working with Symfony's core components, and why a Drupal major upgrade is also a Symfony major upgrade.
Symfony or Laravel for an enterprise application?
Symfony suits long-lived, complex systems: decoupled components, explicit configuration, a predictable LTS cadence, and a service architecture that supports long-term maintainability. Laravel favours convention and speed of initial delivery, which suits smaller applications and faster time-to-first-release. Metadrop works in both and recommends per project during discovery, based on lifespan, team composition and integration surface. Laravel services are covered separately.
Which Symfony versions do you upgrade from?
From Symfony 2.x and 3.x upward, stepwise through each major release to the current LTS, as well as 4.x and 5.x codebases. Legacy PHP applications with no framework, or on an abandoned in-house framework, are handled as migrations rather than upgrades.
How long does a Symfony major-version upgrade take?
A typical single-major upgrade of a mid-sized application runs 4 to 12 weeks, depending on codebase size, third-party bundle count and existing test coverage. Multi-major jumps are planned as consecutive steps, each with its own release, rather than a single long-running branch. The codebase audit in the first phase replaces this range with a project-specific estimate before any commitment.
How much does Symfony development cost?
Cost is driven by integration count, domain complexity, data-migration volume and the test coverage already in the codebase. Metadrop quotes per project after a free consultation, and offers a paid audit or discovery phase as a standalone first step whose scope and estimate the client keeps.Should we use API Platform or a custom Symfony REST API?
API Platform is the faster route when the API maps onto a domain model, since it generates REST and GraphQL endpoints, OpenAPI documentation and JSON-LD/Hydra output from the same resource definitions. A hand-built controller layer fits better when the API surface is small, highly bespoke, or shaped by an external contract that does not follow the resource model. Both are common in Metadrop projects, and the choice is made in the architecture phase.
Are your Symfony applications GDPR, WCAG and NIS2 ready?
GDPR-aligned data flows and WCAG 2.1 AA accessibility are part of the delivery baseline, with WCAG 2.2 AA applied as a design-quality target. Delivery practice is prepared for NIS2 requirements, and Metadrop is ENS-certified for Spanish public-sector work. Whether a given application meets a standard depends on the client's own scope, content and processing, so this is a technical readiness statement rather than legal advice.Can you take over a Symfony application built by someone else?
Yes. Onboarding an inherited codebase starts with an audit, environment reproduction, bootstrapping an automated test suite, and a documented runbook before feature work begins. After onboarding, the application moves onto a support retainer with contractual response targets per priority level.