symfony/ux-live-component
Live components for Symfony
v3.4.0
7.8M downloads/mo
#1011 most downloaded on Packagist
symfony/ux-live-component
What this package is like to depend on
Last release 29 days ago
25 Jul 2026
Ships fairly regularly
a new release about every 5 weeks
Some releases are documented
notes for 38 of 65 stable releases
Nothing withdrawn
no release was ever pulled
5 years old
65 releases · first in 2021
11 releases in the last 12 months
see the full history below
Release timeline
63 releases · Dec 2021 to Jul 2026Releases
latest 60 of 65-
v3.4.025 Jul 2026Release notes
Open source →Changelog (v3.3.0...v3.4.0)
- bug #3730 Fix broken assets/tsconfig.json reference breaking webpack 5.109+ builds (@zalesak)
-
v3.3.010 Jul 2026Release notes
Open source →Changelog (v3.2.0...v3.3.0)
- bug #3676 Avoid 500 errors on malformed hydration payloads (@Amoifr)
- bug #3688 Fix data-loading scanner ignoring data-live-ignore subtrees (@Amoifr)
- bug #3690 Fix support for nullable collection properties on component (@rogierknoester)
-
v3.2.005 Jun 2026 -
v3.1.029 May 2026Release notes
Open source →Changelog (v3.0.0...v3.1.0)
- security #557 Require X-Requested-With header to prevent CSRF (@Kocal)
- security #cve-2026-49208 Parse format-less date LiveProps strictly with RFC 3339 (@Kocal)
- security #cve-2026-49209 Cap the number of actions per
_batchrequest (@Kocal) - security #cve-2026-49210 Reject malicious child component tags (@Kocal)
- security #cve-2026-49212 Bind HMAC checksum to component name and slot (@Kocal)
- feature #3432 Improve form validation error messages in exceptions (@PierreCapel)
- bug #3566 Make
LiveComponentSubscribersafe-by-default (@Kocal) - bug #3508 Fix dynamic template resolution when using "loading" attribute (@xDeSwa)
- feature #3442 Use
aria-busyattribute during component re-render (@Amoifr)
-
v3.0.010 Apr 2026Release notes
Open source →Changelog (v2.34.0...v3.0.0)
- feature #3452 Remove compatibility layer with Symfony PropertyInfo <7.1 (@Kocal)
- feature #3453 Update minimum required Symfony version to 7.4 (@Kocal)
- feature #3450 Upgrade minimum required PHP version to 8.4 (@Kocal)
- feature #3407 Allow Symfony UX 3.x packages (@Kocal)
- bug #3398 Post-merge fixes for 3.x (@Kocal)
- bug #3187 Add phpunit.dist.xml in .gitattributes (@Kocal)
- bug #3182 Drop Symfony PHPUnit Bridge in favor of PHPUnit >= 11.0 (@Kocal)
- feature #3051 Remove deprecations (@smnandre)
- feature #2998 Upgrade minimum required PHP version to 8.2 (@Kocal)
- feature #2996 Update minimum required Symfony version to ^6.4 (@Kocal)
-
v2.36.029 May 2026Release notes
Open source →Changelog (v2.35.0...v2.36.0)
- security #557 Require X-Requested-With header to prevent CSRF (@Kocal)
- security #cve-2026-49208 Parse format-less date LiveProps strictly with RFC 3339 (@Kocal)
- security #cve-2026-49209 Cap the number of actions per
_batchrequest (@Kocal) - security #cve-2026-49210 Reject malicious child component tags (@Kocal)
- security #cve-2026-49212 Bind HMAC checksum to component name and slot (@Kocal)
-
v2.35.004 Apr 2026Release notes
Open source →Changelog (v2.34.0...v2.35.0)
- feature #3407 Allow Symfony UX 3.x packages (@Kocal)
-
v2.34.021 Mar 2026 -
v2.33.015 Mar 2026Release notes
Open source →Changelog (v2.32.0...v2.33.0)
- bug #3372 Fix reflection issues for private properties from trait and parent class (@kachnitel)
- feature #3364 Add
debug:live-componentcommand (Mickaël BULIARD) - feature #3361 Allow components use dynamically templates (@xDeSwa)
- bug #3363 Fix preservation of !important inline style changes (@xDeSwa)
- feature #3362 Migrate from tsup (deprecated) to tsdown (@Kocal)
- bug #3353 Fix PHPDoc types of
TestLiveComponent::call()(@StevenRenaux) - feature #3336 Add option
fetchCredentials(@Kocal) - bug #3337 Fix tests with lowest dependencies, incompatibility with
zenstruck/foundryand Symfony 5.4 (@GromNaN) - bug #3325 Fix minimum requested 6.x version of FrameworkBundle for LiveComponent (@Kocal)
- bug #3304 Fix npm releases due to
repositoryissue (@Kocal) - bug #3290 Update root JS dependencies (@Kocal)
- bug #3279 Remove usage of framework.annotations.enabled (@Kocal)
-
v2.32.003 Jan 2026Nothing published for this version
-
v2.31.022 Oct 2025Nothing published for this version
-
v2.30.027 Aug 2025Nothing published for this version
-
v2.29.218 Aug 2025Nothing published for this version
-
v2.29.108 Aug 2025Nothing published for this version
-
v2.29.007 Aug 2025 -
v2.28.230 Jul 2025Nothing published for this version
-
v2.28.128 Jul 2025Nothing published for this version
-
v2.28.027 Jul 2025Release notes
Open source →-
Add new modifiers for input validations, useful to prevent unnecessary HTTP requests:
min_lengthandmax_length: validate length from textual input elementsmin_valueandmax_value: validate value from numeral input elements
-
Add new
mapPathoptions (defaultfalse) toUrlMappingof aLivePropto allow the prop to be mapped to the path instead of the query in the url.
<!-- Do not trigger model update until 3 characters are typed --> <input data-model="min_length(3)|username" type="text" value="" /> <!-- Only trigger updates when value number is between 10 and 100 --> <input data-model="min_value(10)|max_value(100)|quantity" type="number" value="20" /> -
-
v2.27.022 Jun 2025Release notes
Open source →- Add events assertions in
InteractsWithLiveComponents:
$testComponent = $this->createLiveComponent(name: 'MyComponent'); $renderedComponent = $testComponent->render(); // Assert that the component did emit an event named 'event' $this->assertComponentEmitEvent($render, 'event') // optionally, you can assert that the event was emitted with specific data... ->withData(['arg1' => 'foo', 'arg2' => 'bar']) // ... or only with a subset of data ->withDataSubset(['arg1' => 'foo']); // Assert that the component did not emit an event named 'another-event' $this->assertComponentNotEmitEvent($render, 'another-event'); - Add events assertions in
-
v2.26.106 Jun 2025Nothing published for this version
-
v2.26.031 May 2025Release notes
Open source →LiveProp: Pass the property name as second parameter of themodifiercallable- Add compatibility layer to fix deprecation with
Symfony\Component\PropertyInfo\PropertyInfoExtractor::getTypes(). If you use PHP 8.2 or higher, we recommend you to update dependencysymfony/property-infoto at least 7.1.0
-
v2.25.219 May 2025Nothing published for this version
-
v2.25.119 May 2025Nothing published for this version
-
v2.25.017 May 2025Release notes
Open source →- Add support for Symfony UID hydration/dehydration
ComponentWithFormTraitnow correctly checks for aTranslatableInterfaceplaceholder for<select>elements- Fix
LiveComponentHydrator::hydrateValue()to hydrate null values
-
v2.24.012 Mar 2025Nothing published for this version
-
v2.23.007 Feb 2025Release notes
Open source →- Allow configuring the secret used to compute fingerprints and checksums.
- Prevent
__componentproperty to be serialized when calledJSON.stringify()
-
v2.22.107 Dec 2024Nothing published for this version
-
v2.22.029 Nov 2024 -
v2.21.015 Oct 2024Nothing published for this version
-
v2.20.024 Sep 2024Nothing published for this version
-
v2.19.211 Aug 2024Nothing published for this version
-
v2.19.009 Aug 2024 -
v2.18.110 Jun 2024Nothing published for this version
-
v2.18.006 Jun 2024 -
v2.17.022 Apr 2024Release notes
Open source →- Add
modifieroption inLivePropso options can be modified at runtime. - Fix collections hydration with serializer in LiveComponents
- Add
loadingattribute to defer the rendering on the component after the page is rendered, either when the page loads (loading="defer") or when the component becomes visible in the viewport (loading="lazy"). - Deprecate the
deferattribute. - Add
UrlMappingconfiguration object for URL bindings in LiveComponents
- Add
-
v2.16.029 Feb 2024Release notes
Open source →-
LiveComponents is now stable and no longer experimental 🥳
-
[BC BREAK] The
data-action-nameattribute behavior was removed in favor of using Stimulus "action parameters" anddata-live-action-param. This is a breaking change if you were using thedata-action-nameattribute directly in your templates. #1418To upgrade your application, follow these changes:
<button data-action="live#action" - data-action-name="debounce(300)|save" + data-live-action-param="debounce(300)|save" >Save</button>To pass arguments to an action, also use the Stimulus "action parameters" syntax:
<button data-action="live#action" - data-action-name="addItem(id={{ item.id }}, itemName=CustomItem)" + data-live-action-param="addItem" + data-live-id-param="{{ item.id }}" + data-live-item-name-param="CustomItem" >Add Item</button>Additionally, the
preventmodifier (e.g.prevent|save) was removed. Replace this with the standard Stimulus:preventaction option:<button - data-action="live#action + data-action="live#action:prevent" - data-action-name="prevent|save" + data-live-action-param="save" >Save</button> -
[BC BREAK] The
data-eventattribute was removed in favor of using Stimulus "action parameters": renamedata-eventtodata-live-event-param. Additionally, if you were passing arguments to the event name, use action parameter attributes for those as well - e.g.data-live-foo-param="bar". #1418 -
Reverted setting
ignoreActiveValue: truein Idiomorph #1548 -
New placeholder macro to generate defer/lazy skeleton #1532
-
improve TestLiveComponent::actingAs() #1461
-
Drop Twig 2 support #1436
-
Add better error message when hydrating dates #1431
-
Store TemplateMap in build_dir #1525
-
-
v2.15.020 Feb 2024Release notes
Open source →- [BC BREAK] The
data-live-idattribute was changed toid#1484 - Fixed child handling bug during re-rendering introduced with the new morphing library in 2.14.0 #1484
- Fix bug where the active input would maintain its value, but lose its cursor position #1501
- Restrict Twig 3.9 for now #1486
- [BC BREAK] The
-
v2.14.203 Feb 2024Nothing published for this version
-
v2.14.103 Feb 2024Release notes
Open source →- Fixed a regression in the testing tools related to the default HTTP method change
-
v2.14.030 Jan 2024Release notes
Open source →- [BC BREAK] DOM morphing changed from
morphdomtoidiomorph. As this is a different morphing library, there may be some edge cases where the morphing behavior is different. - Add support for URL binding in
LiveProp - Allow multiple
LiveListenerattributes on a single method - Requests to LiveComponent are sent as POST by default
- Add method prop to AsLiveComponent to still allow GET requests, usage:
#[AsLiveComponent(method: 'get')] - Add a new
urlReferenceTypeparameter toAsLiveComponent, which allows to generate different type URL (e.g. absolute) for the component Ajax calls - The
symfony/serializerdependency is now optional - Added a
data-skip-morphattribute to allow skipping morphing of an element (the element's attributes will be morphed, but its inner HTML will be overwritten instead of morphed) - Added an entry to the packages'
package.jsonfile so that@symfony/ux-live-componentwill appear in the user'simportmap.phpfile if using AssetMapper. This will allow using the JavaScript from the package without extra setup. - Fixed edge-case rendering bug where a 2nd Ajax request might start before the 1st finished processing
- Fix usage of
{% embed %}with{% block %}in<twig:>components - Fixed
data-loadingnot working when on root element of a component - Fixed error when
classattributes contained a space at start or end - Fixed loading directives being matched in a child component
- [BC BREAK] DOM morphing changed from
-
v2.13.301 Dec 2023Nothing published for this version
-
v2.13.211 Nov 2023 -
v2.13.108 Nov 2023Nothing published for this version
-
v2.13.007 Nov 2023Release notes
Open source →- Add deferred/lazy rendering of Live Components.
- Fix option tag synchronization.
- Handle array-like objects when working with checkboxes.
- Add Symfony 7 support.
- Normalize "true" & "false" model values
- Fix DTO hydration from phpdoc typehints.
- Fix instantiating LiveComponentMetadata multiple times.
- Change JavaScript package to
type: module. - Throwing an error when setting an invalid model name.
-
v2.12.022 Sep 2023Release notes
Open source →- Add support for (de)hydrating DTO classes in
LiveProp. - Fixed
emit()method ofTestLiveComponentto properly test events. - Add
actionAs()toTestLiveComponent. - Fixed rendering bug when using Chrome's translation feature.
- Add
onUpdated()hook forLiveProp. - Fix support for Alpine.js & live components.
- Add support for (de)hydrating DTO classes in
-
v2.11.207 Sep 2023Nothing published for this version
-
v2.11.105 Sep 2023Nothing published for this version
-
v2.11.024 Aug 2023Release notes
Open source →- Add helper for testing live components.
- Add initial file upload support.
- Respect
data-turbo="false"when handling redirects. - Fix checksum calculation for deeply nested data.
-
v2.10.025 Jun 2023Nothing published for this version
-
v2.9.130 May 2023Nothing published for this version
-
v2.9.026 May 2023 -
v2.8.116 May 2023Release notes
Open source →- Increased the priority of
LiveComponentSubscriberControllerEventfrom 0 to 10 to fix incompatibility with SensioFrameworkExtraBundle.
- Increased the priority of
-
v2.8.001 May 2023Release notes
Open source →- [BC BREAK]: The
exposedoption was changed towritableinLiveProp:
-#[LiveProp(exposed: ['email', 'plainPassword'])] +#[LiveProp(writable: ['email', 'plainPassword'])] public User $user;-
[BC BREAK]:
LivePropvalues are no longer automatically (de)hydrated through Symfony's serializer. UseLiveProp(useSerializerForHydration: true)to activate this. Also, aserializationContextoption was added toLiveProp. -
[BC BREAK]: Child components are no longer automatically re-rendered when a parent component re-renders and the value of one of the props passed to the child has changed. Pass
acceptUpdatesFromParent: trueto anyLivePropon the child component to re-enable this behavior. -
Non-persisted entity objects can now be used with
LiveProp: it will be serialized using the serializer. -
Better support for using arrays with
LiveProp. -
Smart rendering system! If you have JavaScript that makes changes to the DOM inside a live component, those changes will now be kept when the component is re-rendered. This has limitations - see the documentation.
-
You can now
emit()events to communicate between components. -
You can now dispatch DOM/browser events from components.
-
Boolean checkboxes are now supported. Of a checkbox does not have a
valueattribute, then the associatedLivePropwill be set to a boolean when the input is checked/unchecked. -
A
formatoption was added toLivePropto control howDateTimeproperties are (de)hydrated. -
Added support for setting
writableto a property that is an object (previously, only scalar values were supported). The object is passed through the serializer. -
Invalid data sent by the user is now handled in a robust way. Previously, if the user sent invalid data (e.g. a string for a
LivePropthat has aninttype), the component update would break. Now, if the new data cannot be hydrated onto the object during a re-render, the last valid value is used. -
When using
ValidatableComponentTrait, a new_errorsvariable is sent to the template, which is easier to use! -
Several bug fixes to parent - child components - see #700.
-
Fixed handling of boolean attributes to a component - see #710.
-
Fixed performance calculating component fingerprint for large components.
- [BC BREAK]: The
-
v2.7.124 Jan 2023Nothing published for this version
-
v2.7.019 Jan 2023Release notes
Open source →-
[BC BREAK]: The "key" used to load the controller in your
assets/controllers.jsonfile changed fromtypedtolive. Update yourassets/controllers.jsonfile to change this key. -
Add a strategy for adding a Stimulus controller to a Twig component - #589.
-
Added a new
getCompontent()function in JavaScript as the best way to find a Component object for a given element. -
Fixed various bugs related to child component handling - #596
-
Added a new
routeparameter toAsLiveComponent, which allows to choose another route for Ajax calls. -
Add
assets/srcto.gitattributesto exclude source TypeScript files from installing. -
TypeScript types are now included.
-
Added new
response:errorJavaScript component hook for custom handling Ajax errors - #587.
-
-
v2.6.128 Nov 2022Nothing published for this version
-
v2.6.0no dateRelease notes
Open source →- [BC BREAK]: The path to
live_component.xmlchanged and the import now MUST have aprefix: you should update your route import accordingly (the name of the route also changed toux_live_component):
# config/routes/ux_live_component.yaml live_component: - resource: '@LiveComponentBundle/Resources/config/routing/live_component.xml' + resource: '@LiveComponentBundle/config/routes.php' + prefix: /_components- Removed
Content-Typeheader when returning the empty response redirect. - Fixed bug when re-rendering SVG's (.#557)
- [BC BREAK]: The path to
-
v2.5.006 Nov 2022Release notes
Open source →-
[BEHAVIOR CHANGE] Previously, Ajax calls could happen in parallel (if you changed a model then triggered an action before the model update Ajax call finished, the action Ajax call would being in parallel). Now, if an Ajax call is currently happening, any future requests will wait until it finishes. Then, all queued changes (potentially multiple model updates or actions) will be sent all at once on the next request.
-
[BEHAVIOR CHANGE] Fields with
data-modelwill now have theirvalueset automatically when the component initially loads and re-renders. For example, previously you needed to manually set the value in your component template:<!-- BEFORE --> <input data-model="firstName" value="{{ firstName }}">This is no longer necessary: Live Components will now set the value on load, which allows you to simply have the following in your template:
<!-- AFTER --> <input data-model="firstName"> -
[BEHAVIOR CHANGE] The way that child components re-render when a parent re-renders has changed, but shouldn't be drastically different. Child components will now avoid re-rendering if no "input" to the component changed and will maintain any writable
LivePropvalues after the re-render. Also, the re-render happens in a separate Ajax call after the parent has finished re-rendering. -
[BEHAVIOR CHANGE] If a model is updated, but the new value is equal to the old one, a re-render will now be avoided.
-
[BEHAVIOR CHANGE] Priority of
DoctrineObjectNormalizerchanged from 100 to -100 so that any custom normalizers are used before tryingDoctrineObjectNormalizer. -
[BC BREAK] The
live:update-modelandlive:renderevents are not longer dispatched. You can now use the "hook" system directly on theComponentobject/ -
[BC BREAK] The
LiveComponentHydrator::dehydrate()method now returns aDehydratedComponentobject. -
Added a new JavaScript
Componentobject, which is attached to the__componentproperty of all root component elements. -
the ability to add
data-loadingbehavior, which is only activated when a specific action is triggered - e.g.<span data-loading="action(save)|show">Loading</span>. -
Added the ability to add
data-loadingbehavior, which is only activated when a specific model has been updated - e.g.<span data-loading="model(firstName)|show">Loading</span>. -
Unexpected Ajax errors are now displayed in a modal to ease debugging! #467.
-
Fixed bug where sometimes a live component was broken after hitting "Back: in your browser - #436.
-
-
v2.4.015 Aug 2022Release notes
Open source →-
[BC BREAK] Previously, the
idattribute was used withmorphdomas the "node id" when updating the DOM after a render. This has changed todata-live-id. This is useful when maintaining the correct order of a list of elements. -
[BC BREAK] If using
LiveCollectionType, the name of the remove field changed frombutton_delete_prototypetobutton_deleteand the add field changed frombutton_add_prototypetobutton_add. Additionally, theallow_addandallow_deletedefault values were changed fromfalsetotrue. -
[BEHAVIOR CHANGE] If an action Ajax call is still processing and a model update occurs, the component will no longer re-render. The model will be updated internally, but not re-rendered (so, any model updates would effectively have the
|norendermodifier). See #419.
-
-
v2.3.008 Jul 2022Release notes
Open source →- [BC BREAK] The
data-action="live#update"attribute must now be removed from nearly all elements. This is because LiveComponents now automatically listens to theinputevent on all elements with adata-modelattribute and updates the data. If you previously useddata-action="change->live#update"to list on thechangeevent, now you should use theon(change)modifier insidedata-model.
<!-- BEFORE --> <input data-model="max" data-action="change->live#update" > <!-- AFTER --> <input data-model="on(change)|max" >- [BC BREAK] The
live#updateDeferaction was removed entirely. Now, to update a model without triggering a re-render, use thenorendermodifier fordata-model:
<!-- BEFORE --> <input data-model="max" data-action="live#updateDefer" > <!-- AFTER --> <input data-model="norender|max" >- [BC BREAK] The
nameattribute is no longer automatically used to update a model when a parent component hasdata-action="change->live#update". To make a form's fields behave like "model" fields (but using thenameattribute instead ofdata-model) you need to add adata-modelattribute to the<form>element around your fields (NOTE: the new attribute is automatically added to yourformelement when usingComponentWithFormTrait):
<!-- BEFORE --> <form data-action="change->live#update"> <input name="max" > </form> <!-- AFTER --> <form data-model="on(change)|*"> <input name="max" > </form> - [BC BREAK] The