This week, Symfony 6.4.44, Symfony 7.4.17 and Symfony 8.1.5 maintenance versions were released. In addition, we introduced Symfony Language Tools, the official Symfony LSP server. Finally, we started experimenting with issue-first open source contributions.

Symfony development highlights

This week, 219 pull requests were merged (195 in code and 24 in docs) and 140 issues were closed (116 in code and 24 in docs). Excluding merges, 56 authors made additions and deletions. See details for code and docs.

6.4 changelog:

  • 8af4fc1: fix PHP 8.6 deprecations
  • 288f18c: [HttpFoundation] declare create_sid() on session handlers
  • 739f568: [Translation] read CSV translations without SplFileObject
  • 3737c4b: [Validator] allow a literal # in the fragment part of Url
  • 6db3313: [DomCrawler] fix matches(), closest() and children() for selectors with a combinator or a positional pseudo-class
  • d468ff0: [DomCrawler] read the whole content of a textarea
  • 478d379: [DomCrawler] fix FormField::getLabel() when the field id contains a quote
  • 72b169b: [Yaml] fo not treat an uppercase 0X prefix as hexadecimal
  • 0dafb70: [Console] consume the whole escape sequence when reading autocomplete input
  • eb0649f: [Security] reject malformed login link parameters instead of throwing a TypeError
  • 1936664: [WebProfilerBundle] fix wrongly disabled tabs and toggles that cannot be focused
  • 7cec81e: [Cache] fix Predis ignoring the "auth" parameter set in the DSN or in the options
  • 24fad82: [Yaml] fix parsing an alias followed by a comment
  • 6ba0e90: [Cache] fix numeric string keys being cast to integers
  • 5b308fe: [Cache] validate every key before deleting any in ArrayAdapter::deleteItems()
  • f867eae: [Config] fix dumping keyless prototyped arrays of arrays in XmlReferenceDumper
  • d175fba: [HttpKernel] fix concurrent cache warmups corrupting the deprecations log
  • 98aac95: [Validator] add the EntityExists and Ulid message translation units
  • 7ca7240: [TwigBridge] pass a valid XML version to DOMDocument in the form layout test case
  • 455fa5f: [Form] fix the money pattern for locales that do not use ASCII digits
  • b04691c: [Form] replace the {{ max }} placeholder in the post_max_size error message
  • c6b5542: [Scheduler] fix infinite loop in PeriodicalTrigger when the interval cannot move the run date forward
  • 9084ee5: [VarDumper] fix losing colors when dumping to php://output on the CLI
  • 462f407: [Mailer] fix the SMTP scheme check in the transport factory test case
  • fb80a5e: [VarDumper] fix division by zero when dumping a DatePeriod whose interval does not move forward
  • bbc6497: [Translation] fix pushing numeric translation keys to Lokalise
  • efa6d9f: [Filesystem] fix mirror() deleting files from the origin directory
  • 54b77ad: [Yaml] fix parsing tagged block scalars inside sequences
  • f7cab19: [Console] fix clearing more lines than a section holds
  • b8e2343: [HttpKernel] write pending dumps to the output before dd() exits
  • 6a30d4b: [Finder] do not report dangling symlinks as both files and directories
  • 08e39f6: [DependencyInjection] detect circular references through a shared factory builder
  • 1b7b37d: [Console] keep backslashes preceding < and > when escaping text
  • 40afbd2: [Scheduler] fix infinite loop in MessageGenerator when a trigger does not move the run date forward
  • 09d68c4: [Finder] fix gitignore matching of negated patterns and excluded directories
  • 1bf921a: [Serializer] allow array indexes in the property paths of attributes when denormalizing
  • df8544c: [HttpKernel] send the response content before terminating the kernel in the test client
  • 2a4679c: [Form] apply the guessed "pattern" and "maxlength" attributes to text inputs only
  • 0ef6a5c: [BrowserKit] return the most specific cookie when several ones match
  • 7379818: [PropertyInfo] use the same mutator method for types and write info
  • 756de14: [Mailer] fix emails reported twice when they are queued and sent in the same process
  • 523cca6: [Security] track session usage when a lazy firewall reads the token
  • aa79b74: [Form] apply the guessed "pattern" and "maxlength" attributes to the types rendered as text inputs
  • 96ba24f: [DependencyInjection] fix sorting tagged services when autoconfiguration duplicates a tag
  • 29e0bd2: [DependencyInjection] fix compiling nested service locators
  • a092ef3: [FrameworkBundle] fix debug:config and config:dump-reference when a bundle registers services in its build method
  • 00f6b4b: [FrameworkBundle] fix ignored --raw option of debug:router
  • 8716036: [FrameworkBundle] show the effective priority of tagged services in debug:container
  • 0dd8fdb: [HttpClient] fix CachingHttpClient when trusted hosts are configured
  • 9639e8d: [Mailer] remove metadata headers from the emails sent by the SES HTTP transports
  • f41e657: [Messenger] remove the worker listeners when messenger:consume ends
  • 4343f48: [Messenger] fail when messenger:consume is given no receiver
  • b0264c7: [MonologBridge] fix NotifierHandler calling a method that NotifierInterface does not declare
  • fee9562: [Scheduler] fix refreshing the checkpoint lock with a negative TTL
  • cef8123: [Serializer] fix XmlEncoder skipping normalizers for nested Traversable values
  • 03a3ceb: [Translation] stop leaking a temporary schema copy per validated XLIFF file inside a phar
  • 632758c: [TwigBridge] fix the broken error box around Bootstrap 4 date and time widgets
  • f32d686: [Process] do not wait for output when the input iterator has more data
  • 58935f7: [DoctrineBridge, EventDispatcher] fix losing listeners when a lazy listener adds listeners
  • 349059c: [Notifier] fix SendFailedMessageToNotifierListener rejecting any notifier but the concrete one
  • b7f8d8a: [Serializer] allow the attributes of nested discriminator maps when denormalizing
  • 2d47f8d: [Serializer] fix XmlEncoder dropping the extra attributes of item elements on decode
  • b4c4bfd: [PropertyInfo] fix the priority of the accessor named after the property
  • 28e867c: [Security] refresh the impersonator while impersonating
  • 76f929a: [Messenger] stop applying serialization groups and attribute filters to stamps
  • 09a1508: [BrowserKit] fix decoding raw cookie values that contain a plus sign
  • c61009d: [Intl] follow the ICU parent locale when falling back
  • cc48512: [Mime] reject an unquoted "@" in the local part of an email address
  • 8b9dabf: [PhpUnitBridge] fix finding the project root when vendor/ is a symlink
  • 3890f82: [Serializer] fix SerializedName being ignored on denormalization when the attribute has groups
  • f367be8: [HttpKernel] ignore the session id that PHP kept from a previous request
  • c3bdf59: [Messenger] ignore the option-less handler tag added by autoconfiguration
  • 571a974: [HttpKernel] forward the request headers to inline rendered fragments
  • 782cd1a: [FrameworkBundle] fix dispatching console events after cache:clear
  • e71a61a: [DomCrawler] detect the charset from meta tags only
  • b7becdf: [Form] do not inherit translation parameters for translatable labels and help messages
  • bc468b6: [FrameworkBundle] fix lint:container skipping services matched by tagged iterators
  • 9ebc0a7: [HttpKernel] restore the locale that was in use before a sub-request
  • bfffc41: [Form] apply the configured rounding mode when no scale is set
  • 445eb1f: [DependencyInjection] keep % escaping when resolving values against a resolved parameter bag
  • 4b4dd4d: [Scheduler] reject canceled scheduled messages so async transports do not redeliver them
  • 7c6575d: [ErrorHandler] fix leaking an exception handler when not replacing the error handler
  • 1e7cccd: [Form] fix rendering and parsing dates before the Gregorian cutover
  • d818386: [HttpKernel] fix caching responses that cannot provide their content
  • 7cdaf5d: [CssSelector] fix :disabled and :enabled inside nested fieldsets
  • a13a5f7: [Form] map violations to child forms named after the snake cased property
  • e7b4c85: [Validator] fix auto-mapping strategies being ignored on inherited properties
  • 6c574d2: [Messenger] tell apart handler services that share the same class
  • 0d6e0c4: [WebProfilerBundle] fix the mailer panel crashing when an attached file was deleted
  • 0fa959c: [Security] match check paths given as a route alias
  • 880b692: [Serializer] fix denormalizing mime messages typed as RawMessage

7.4 changelog:

  • 80757cf: [ObjectMapper] only honor an explicitly inbound target #[Map] for the same-name copy
  • 296ce03: [Notifier, Mercure] add support for Mercure 0.8
  • 63a9af9: [DependencyInjection] skip abstract classes and interfaces in findTaggedResourceIds()
  • 8dc3721: [ErrorHandler] don't autoload when resolving "@return" class constants
  • 40048b3: [Form] fix generating the CSRF token when the form attributes are replaced
  • 9d1586a: [TypeInfo] fix resolving constants defined on interfaces

8.1 changelog:

  • 6df52b6: [Yaml] restore the default dump output for sequences of mappings
  • 4591a00: [DoctrineBridge] fix explicit MapEntity mapping being overwritten by a route mapping
  • e7359c3: [ObjectMapper] allow #[Map] on abstract classes
  • 64cfd73: [Tui] batch of bug fixes
  • 6de6134: [Tui] stop delivering the rest of an over-cap paste as key events
  • b8ed1ce: [Console] do not resolve core utility parameters as command input

8.2 changelog:

  • 58ac0ff: [Uid] add createBoundaries() to Ulid, UuidV6 and UuidV7
  • 21ef5de: [Form, TwigBridge] render the name attribute of the <form> element through attr
  • 38064c6: [Messenger] pass the routing key to the serializer when decoding in Amqp
  • 94c8cbc: [DoctrineBridge] fix mapped route params with array-typed arguments
  • 10e7385: [Routing, SecurityBundle] add a firewall option to route definitions
  • 38ba912: [FrameworkBundle] add security expression functions to the validator expression language
  • 8fa8fd8: [Config, FrameworkBundle] add a way to append multiple nodes via a callback
  • ab6c0b5: [Mailer] add a bridge for the Cloudflare email service
  • add4ddb: [Scheduler] show "Next Run In" column in debug:scheduler command
  • 4e35762: [Scheduler] add env option to #[AsCronTask] and #[AsPeriodicTask]
  • 8c0ca3f: [FrameworkBundle, Mailer] align the S/MIME listeners with the PGP/MIME design
  • b1d6401: [AhaSend] add support for the v2 API
  • b64406b: [TelegramNotifier] add support for editing media messages
  • 7c37936: [AssetMapper] add a minimum release age for importmap updates
  • fb464fa: [HttpKernel] let source value resolvers stage a value for the resolvers that follow them
  • 51c53c3: [Messenger] add an optional LoggingMiddleware logging processing time and memory usage
  • 602b67f: [FrameworkBundle, Mailer, Mime] add PGP/MIME signing and encryption support
  • 1847acd: [Mailer] add DSN param timeout to configure the SMTP connect/read/write timeout
  • 4514dd2: [Messenger] dispatch events before & after each handler
  • 071ecb0: [FrameworkBundle, WebLink] add RFC 9264 link sets and the RFC 9652 Link-Template header
  • d379f5d: [Scheduler] deprecate Schedule::with()
  • 97ebde8: [Mime] add AbstractPart::setContentTypeParameter()
  • f7d352e: [Security] allow passing extra signed parameters in the login link URL
  • b99a890: [DoctrineBridge, FrameworkBundle] add doctrine.orm.entity tag and AttributeClassesDriver to auto-discover entities
  • 1672387: [Validator] accept the ::class constant of the annotated class in GroupSequence
  • 84bf64a: [Translation] re-add the POEditor provider bridge
  • 89bb93d: [DependencyInjection] allow computing resource tag attributes per tagged class
  • 713dfef: [Tui] add AnsiUtils::walkCells(), AnsiUtils::sliceToWidth() and AbstractWidget::postRender()
  • f166ecb: [DependencyInjection] skip interfaces when computing lazy tag attributes
  • 8c9b92e: [DependencyInjection, FrameworkBundle] add #[AutowireClassMap] to inject a class map built from resource tags
  • 2bb8807: [Console, DependencyInjection, HttpKernel] support union and intersection types as controller and command arguments
  • f51cbf1: [Messenger] add MongoDB bridge
  • d6893ea: [Validator] add BcMath\Number support to comparison and Range constraints
  • 7a70b48: [FrameworkBundle, HttpKernel] allow excluding requests from being profiled
  • 4965a1d: [Routing] reject "_firewall" as a host parameter
  • 68ddfa1: [Messenger] add messenger:show command to inspect pending messages
  • d8e8a17: [WebProfilerBundle] make the profiler panels keyboard and screen reader accessible
  • 8fb721f: [TwigBridge] add a "for _self" modifier to the trans_default_domain tag
  • dec4ba8: [RateLimiter] add RateLimiterBuilder
  • a12b451: [FrameworkBundle, Mailer] add TrackingHeader for per-message open/click tracking across bridges
  • a697378: [DoctrineBridge] add the EntityExists constraint
  • 96803cc: [HttpFoundation, HttpKernel] handle any +json/+xml media type in #[MapRequestPayload]
  • 4a0a435: [Tui] dispatch paste lifecycle events
  • 61f5d2b: [Mailer] add an SMTP transport for Cloudflare
  • b1c00eb: [Notifier] add AdminRecipientsProviderInterface

Newest issues and pull requests

Symfony Jobs

These are some of the most recent Symfony job offers:

  • Symfony Developer at Steward
    Part-time / Temporary - $8,700 – $13,000 / month
    Full remote
    View details
  • 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