This week, Symfony 7.4.16 and 8.1.4 maintenance versions were released, alongside Symfony UX 3.4.0 and Symfony Polyfill 1.41.0. In addition, we highlighted Twig 4.0's new macro system and first-class sandbox. Finally, we announced that SymfonyLive Germany 2027 will take place in Cologne.

Symfony development highlights

This week, 119 pull requests were merged (99 in code and 20 in docs) and 63 issues were closed (42 in code and 21 in docs). Excluding merges, 45 authors made 17,374 additions and 2,210 deletions. See details for code and docs.

6.4 changelog:

  • b1270c0: [DependencyInjection] fix ParameterBag::clear() leaving stale deprecations and resolution state
  • e7cee72: [Lock] fix a released read lock letting a new read lock through while a write lock is held
  • ba2166e: [FrameworkBundle] fix "cache:clear" failing when the cache dir is rebuilt concurrently
  • d4377a3: [DependencyInjection] don't keep partially-configured shared services when their setup fails
  • cf9b25a: [Mime] escape backslashes in Address::getEncodedName()
  • 1cc9e52: [PropertyInfo] do not report a non-public mutator as writable
  • ea73baa: [HttpKernel] fix failing reset methods preventing later services from resetting
  • 7da7c8d: [PhpUnitBridge] don't return a non-callable from getPhpUnitErrorHandler()
  • 01debdb: [RateLimiter] cap the burst size and the duration computed from it

7.4 changelog:

  • 8b5bd1d: [DependencyInjection] fix #[Autoconfigure] being processed twice for PSR-4-discovered abstract types
  • 89c4a00: [Serializer] fix FILTER_BOOL breaking union type denormalization
  • 5ed530f: [ObjectMapper] fix the class-level mapping of another target being applied
  • 2c70e86: [ObjectMapper] skip nested mapping when no target fits the destination property type
  • 76b128e: [DoctrineBridge] fix compatibility with DBAL < 4.5
  • 421a88d: [Serializer] align union member order between the legacy and TypeInfo paths
  • 7f665fa: [ObjectMapper] fix target property mappings dropped when the source carries metadata
  • 7d164fd: [HttpFoundation] treat a UriSigner expiration of 0 as a date, not as no expiry
  • b29cd72: [Form] distinguish active_at from not_active_at in the CurrencyType choice list cache
  • 33d4474: [Intl] honor the expiry date of currencies that have no start date

8.1 changelog:

  • fc9eeb5: [Messenger] re-send original payload when retrying undecodable messages
  • 5a24570: [DependencyInjection] resolve factories on "service_container" against the concrete container class
  • 75f0748: [Tui] render raw HTML in MarkdownWidget instead of dropping it
  • 9afdce5: [HttpClient] fix GuzzleHttpHandler crashing with guzzlehttp/guzzle ^8.0
  • c452605: [Tui] keep ANSI codes ordered when slicing across a color change
  • a69f3cd: [Console] fix writing one-shot iterables to a CombinedOutput
  • 36e7528: [Console] fix decoding chunked Kitty graphics payloads
  • 90fac06: [Console] fix terminator handling in the image protocols

8.2 changelog:

  • 248433a: [DependencyInjection] allow injecting a service as a lazy proxy on a per-argument basis
  • bae2518: [Validator] allow cascading the current group sequence group to referenced objects
  • a17843c: [Security] improve authentication debugging in the profiler
  • aa80750: [Security] serve the CSRF token id of a firewall through the manager it configures
  • 80735d7: [HttpClient] add the extra.cache_policy option to CachingHttpClient
  • 21ffcec: [Security] add a form helper for the logout
  • 1619ae6: [HttpClient] allow passing a stream or a closure to HttpOptions::buffer()
  • 945ad7b: [TwigBridge] add normalize filter
  • 84d3f68: [HttpClient] document the signature of the closure accepted by the "buffer" option
  • 3fdf092: [HttpFoundation] add ParameterBag::filterCallback()
  • 64c929a: [Cache] remove superflous implements of AdapterInterface
  • 6f0f819: [Form] add a "choice_help" option to ChoiceType
  • cfbc745: [Notifier] add support for tag facets in Bluesky
  • a2612d6: [AssetMapper] allow requiring raw ESM packages
  • 27515cd: [DependencyInjection] sort service definitions only once in PhpDumper
  • 3723235: [Messenger] use configured senders when RedispatchMessage has no transport name
  • eba7aac: [RateLimiter] dispatch a RateLimitExceededEvent when the #[RateLimit] attribute rejects a request
  • c2a373d: [FrameworkBundle, Messenger] add option to disable the RejectRedeliveredMessageMiddleware
  • c15dc45: [Serializer] add a "skip_invalid_attributes" denormalization option
  • 96ec1a3: [FrameworkBundle] remove unused code from legacy controller notation in DelegatingLoader
  • 0b61943: [Security] throw the status-code-specific HttpException for #[IsGranted]
  • 698e280: [AssetMapper] add integrity metadata to importmaps
  • 312e550: [Tui] add attachChild() and detachChild() to AbstractWidget
  • 5c8513b: [HttpFoundation] reject non-integer netmasks in IpUtils
  • 777a565: [JsonStreamer] scan tokens in bulk in the read Lexer
  • 7196468: [ErrorHandler] redesign the exception page
  • 69e487d: [SecurityBundle] use Firewall as default tab in the WebProfiler when no token is set
  • ecdd056: [Notifier] add organization author support via DSN option in LinkedIn
  • 2f660be: [DoctrineBridge] allow using \Closure in #[MapEntity]
  • 0952c22: [Tui] add multiselect option to SelectListWidget
  • 40a2f29: [Security] add path and CSRF options to switch_user
  • b371993: [Routing] allow defining default query parameters

Newest issues and pull requests

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.

SymfonyCasts Updates

SymfonyCasts is the official way to learn Symfony. Select a track for a guided path through 100+ video tutorial courses about Symfony, PHP and JavaScript.

This week, SymfonyCasts published the following updates:

They talked about us

Upcoming Symfony Events

Call to Action

Published in #A week of symfony