This week, development activity for the upcoming Symfony 8.2 release was very intense: PropertyInfo made accessors and mutators configurable with attributes, HttpFoundation added targeted Cache-Control support conforming to RFC 9213, Console attributes can now use callables for descriptions and help text, Messenger added a concurrency option to process messages in parallel, and Mailer introduced support for rate-limited transports. In addition, we announced the Symfony AI Core Team.
Symfony development highlights
This week, 173 pull requests were merged (140 in code and 33 in docs) and 69 issues were closed (46 in code and 23 in docs). Excluding merges, 70 authors made additions and deletions. See details for code and docs.
- cbc6e73: [HttpKernel] fix undefined variable when locking the container build fails early
- 20e4b52: [HttpFoundation] combine trusted host patterns into a single regexp
- d889af3: [Console] restore the catchExceptions state after running a command message
- caad9bd: [Messenger] support queue URLs from the aws-cn and aws-eusc partitions in AmazonSqs
- 00ad623: [AssetMapper] include front controller in dev asset URLs
- 6493f7a: [Mime] do not drop the last line of a resource-backed message
- fe928b0: [PropertyInfo] ignore methods that only look like accessors
- b49cded: [DependencyInjection] fix circular references through expressions
- da13fb1: [FrameworkBundle] reset the notification logger listener between messages
- aefe26f: [Cache] fix stampede protection not being disabled on CLI
- 3332935: [DoctrineBridge] fix removing lazy listeners by object
- 80bbdbd: [Messenger] handle synchronous batch nack
- 0bed777: [HttpClient] remove unused code in AsyncResponse::__destruct()
- 217f22b: [HttpClient] fix mis-armed consumption guard in AsyncResponse::stream()
- d046a5e: [HttpClient] fix abandoned wrapped response throwing on destruct
- 13d1949: [Translation] do not extract messages from classes merely named TranslatableMessage
- 347dff0: [Serializer] throw on XML data without a root node
- a23b6cc: [DependencyInjection] fix class-level tag attributes being overridden by interface-level ones
- 439ada5: [Uid] compare times by value in MockUuidFactory
- 503e53b: [Console] keep falsy answers when collecting an array with #[Ask]
- 7e210be: [Notifier] fix successful sends being reported as failures in Sevenio
- f61f832: [Mailer, Notifier] avoid retaining messages without the profiler
- c81894e: [FrameworkBundle] tolerate a newer DependencyInjection InstanceofType shape in the reference fixture
- aea5616: [FrameworkBundle] do not leak the response body from assertResponseRedirects() when not verbose
- b94e5f6: [Tui] treat a zero terminal size as unknown
- b74c87b: [Console] fix parsing #[Target] attribute on arguments of invokable commands
- 50c86ca: [WebProfilerBundle] move macros to the template root
- 4319188: [Tui] fix stdin framing and key id decoding
- 857bb05: [Tui] fix column width accounting
- fe24ea2: [Tui] reuse cached subtrees during vertical layout
- 4f6e767: [Tui] track descendant positions of cached horizontal layout children
- c307c59: [Tui] clamp borders that do not fit their container
- e918927: [FrameworkBundle] wire the webhook request parser with the configured header names
- a33ed46: [Serializer] convert the elements of scalar collections
- 708f63f: [ObjectMapper] fix reusing an already mapped object for a different target
- 0fc8e9b: [VarExporter] split Exporter::export() so it stops crashing the PHP 8.5 JIT compiler
- f7504bf: [Form] offer the canonical timezone identifier when ICU names collide
- a766a54: [Console] add hidden and deprecated option modes
- b025beb: [RemoteEvent, Notifier] add SMS engagement events
- 2216fd2: [DependencyInjection] write a CACHEDIR.TAG file in the cache and build directories
- b9707fc: [Validator] check File extensions and mimeTypes independently
- 62a295c: [FrameworkBundle] allow enabling advisory locks on a lock resource
- db52959: [Notifier] add the Facebook Page bridge
- f05b8a0: [HttpFoundation] deprecate the unused Request::$trustedHosts property
- ccc7d0a: [Clock] add #[NoDiscard] attribute to DatePoint
- 78ba59d: [Notifier] add the Instagram bridge
- f0ead93: [Notifier] add the Threads bridge
- efe12db: [PropertyInfo] allow defining accessors and mutators via an attribute
- 06e4e07: [Translation] make CrowdinProvider::read() fetch all domains when passed none
- 385b35a: [PropertyInfo, Serializer] enable using #[WithAccessors] with the serializer
- c8b27e7: [Workflow] add default generic types to Workflow Events
- 83f61bf: [SecurityBundle] deprecate access control rules voting on many attributes
- 588feba: [Webhook] add timestamp header and Standard Webhooks signature support
- 3b11ffb: [Messenger] allow auto creation of SQS queue
- 1a73e47: [ObjectMapper] add MappingAwareTransformCallableInterface
- 05fb6e5: [Translation] keep message context in PO files
- de3a2a2: [HttpFoundation] add targeted cache-control support (RFC 9213)
- d44edfe: [Security, SecurityBundle] support decorating custom authentication result handlers
- 3feb3b5: [Messenger] round delays up to bound the number of delay queues in Amqp
- 0270644: [Console] allow callables for the description and help of #[AsCommand], #[Argument] and #[Option]
- f2cfaf6: [DependencyInjection] add factory argument in the #[Autoconfigure] attribute and also enabled the use of factory within instanceof conditionals
- 0871883: [Yaml] add support for int, null, bool yaml tags including quotes
- 264083a: [Messenger, Routing] add RequestContext::runWith() to temporarily generate URLs for another context
- 10d69b9: [HttpKernel] deserialize a JSON query parameter with #[MapQueryString(key:)]
- 46fb63f: [EventDispatcher] do not initialize lazy listeners when they cannot match
- 4747b29: [DependencyInjection] speed up ResolveInstanceofConditionalsPass
- 296e499: [DoctrineBridge, EventDispatcher] defer removing lazy listeners instead of initializing them
- d70b2ec: [Serializer] add AbstractNormalizer::IGNORED_GROUPS to make it possible to ignore groups during serialization
- 0f2fb46: [FrameworkBundle] make BrowserKit assertions non-verbose by default
- 7967754: [Mailer] add return_path_domain to payload in Mandrill
- f048769: [Console, Yaml] add a gitlab output format to the lint:yaml command
- 997b83f: [HttpClient] add support for the QUERY HTTP method to CachingHttpClient
- e5aedb1: [Notifier] add SlackPlainTextInputBlock for Slack message
- 523de6f: [Notifier] add SMS Proxima bridge
- dd106ac: [SecurityBundle] add role hierarchy graph to profiler security panel
- 6242646: [WebProfilerBundle] fix missing has_dump variable
- 5bee8a6: [Messenger] add SQS fair queues support
- 88b63e2: [WebProfilerBundle] display profiler url in logs
- d6fd147: [HttpFoundation] constraint ResponseHeaderSame now shows the actual header value
- 0822e9f: [FrameworkBundle, HttpClient] add the retry_failed.base_uris option to http_client
- bc46c34: [Validator] add a message option to the Callback constraint
- aebbeea: [DoctrineBridge] deprecate DoctrineCloseConnectionMiddleware in favor of the new DoctrineDbalCloseConnectionMiddleware
- e244dff: [Tui] reuse unchanged lines across frames
- 2ddce33: [FrameworkBundle] resolve debug:config paths whose keys contain dots
- 4ca21cd: [HttpKernel] prefix the property path to RequestPayloadValueResolver violation messages
- 3fae4b7: [DomCrawler] add ChoiceFormField::selectByText() to select an option by its text content
- c5f8853: [Messenger] cache the message type hierarchy
- b437076: [Form, TwigBridge] render an id on the form element so form_attr references resolve
- 02b2550: [Messenger] add a --concurrency option to the messenger:consume command to process messages in parallel
- a0462a6: [PropertyInfo] gather data from property hooks in ReflectionExtractor
- 7c0cfc5: [Serializer] support serialized names and paths configuration per group
- 561397b: [Validator] handle object properties in Unique validator
- c54a8e1: [DoctrineBridge] deprecate DoctrineOpenTransactionLoggerMiddleware in favor of the new DoctrineDbalOpenTransactionLoggerMiddleware
- 432042e: [Form] add PolymorphicCollectionType for collections whose entries do not all share the same type
- 5b36e9e: [Security] allow wildcards as placeholders in the role hierarchy
- 4e6fb00: [DoctrineBridge] deprecate DoctrinePingConnectionMiddleware in favor of the new DoctrineDbalPingConnectionMiddleware, add DoctrineDbalTransactionMiddleware
- 42ff5be: [SecurityBundle] add a debug:roles command to inspect the role hierarchy
- d896c56: [Messenger] add --redispatch to messenger:failed:retry
- ea3c360: [Messenger] prioritize receivers via transport configuration
- d1093c3: [Cache] add PdoTagAwareAdapter
- af40eee: [Cache, FrameworkBundle] wire PdoTagAwareAdapter as cache.adapter.pdo_tag_aware
- 6e7df76: [Serializer] add a force_collection option to XmlEncoder
- 235a365: [Cache] implement PruneableInterface on RedisTagAwareAdapter
- 3788ca4: [Notifier] add Firebase v1 API support
- e7edfc7: [Config] generate JSON schema for config
- d0214d3: [Mailer] add support for rate limited mailer transports
Newest issues and pull requests
- [Form][TwigBridge] Allow the group_by option of ChoiceType to return translatable labels
- [PropertyAccess] Add wildcard reads
- [Tui] Add gradient backgrounds (linear, color stops)
- [Serializer] Scalar collection elements are not validated against their declared type
Symfony Jobs
These are some of the most recent Symfony job offers:
- Symfony Developer at ATH
Contract / Freelance - €25 – €50 / hour
Full remote
View details - Lead Symfony Developer at DocuPet
Full-time - CA$140,000 – CA$180,000 / year
Full remote
View details
You can publish a Symfony job offer for free on symfony.com.
They talked about us
- Joining the Symfony AI Core Team
- Symfony and PHP 8.4: Modernizing Without Rewriting Everything
- Are You Really Making the Most of Static Code Analysis?
- Building a RAG-Powered Code Review Assistant with PHP, Ollama, and Qdrant
- Build a JSON-RPC 2.0 API in Symfony in 15 minutes: from composer require to OpenAPI
- PHP 8.4 Lazy Objects, Part 2: From Generated Proxies to Native Lazy Objects: How Symfony and Doctrine Evolved
- Quand le cache de Symfony ralentit votre application…
- Construire un assistant de code review RAG avec PHP, Ollama et Qdrant
- Symfony JSON-RPC API Bundle три года спустя: что боевая эксплуатация сделала с кодом
Upcoming Symfony Events
- Sylius France Community Meetup by ACSEO: Aix en Provence, France (September 28, 2026)
Call to Action
- Follow Symfony on X, on Mastodon, on Bluesky and on Threads and share this article.
- Subscribe to the Symfony blog RSS and never miss a Symfony story again.