symfony / ux

Symfony UX initiative: a JavaScript ecosystem for Symfony
https://ux.symfony.com/
MIT License
824 stars 298 forks source link

[TwigComponents] Communication between two component on server-side #1896

Closed tito10047 closed 3 months ago

tito10047 commented 3 months ago

Hi, is it possible to communicate between two components on server-side without emitting a JavaScript event? I have two independent components and I need to send an event from one component to the other.

I need to emit it when the page is rendered without user input.

I need exactly this: When one (one from many) component is rendered, its loaded from database some status. In some algoritmus is calculated and detected if is going something wrong. In second compoent I want detect if in some components of this page is going wrong and if yes change icon of its element.

Any idea how I can do this? Thanks

WebMamba commented 3 months ago

You can simply use the emit function from ComponentToolsTrait https://symfony.com/bundles/ux-live-component/current/index.html#communication-between-components-emitting-events

smnandre commented 3 months ago

Well,

without emitting a JavaScript event

If you meant "emitting a Javascript myself" @WebMamba is 100% right to say "events" are the way to communicate between instances.

If you meant "with no event beeing dispatched or passing by the front well... it's not possible. As state holders, live components are in the DOM browsers and thus they will need to pass by the Live Controller at a certain point.

Finally, if you meant "between two components that do not know anything about the other, but as a developer i in fact do", then you maybe could use classic PHP Event dispatch ?

tito10047 commented 3 months ago

I talking about classic twigComponent, not live component. Yes, its third scenario. But how I can listen event in one component thats dispatched in other component? that is not posible in symfony, not? because listener must be self services, not twig components.

smnandre commented 3 months ago

You are right,

I'd also say personnaly that maybe they even should not do this, as component are often more "isolated context" than statefull scopes.

What is your real use case there ? Maybe we can suggest alternative solutions ?

tito10047 commented 3 months ago

I want change favicon based on status from other components. I have 2 types of component that change page status in 10 instances. so in page is 20 components. I want from some this component call FaviconComponent for change favicon on page. This 20 instances do some calculations and result is some status o fomething. if one status is danger, i want change favicon

smnandre commented 3 months ago

You could do the opposite: all your livecomponents triggers some event when they compute/change status.

And another one listen to these events and refresh the favicon.

What do you think ?

tito10047 commented 3 months ago

Yes, this is exactly what I want. But I did not use livecomponent. only normal twig component.

Now Im changed everything to livecomponent and, of corse, its working. But question from root comment is not answered. How to send event in normnal twig component.

smnandre commented 3 months ago

Twig components have no state, they are destroyed immediately after render, so they cannot "send" events to the backend, receive other ones, etc etc as no one could answer or use them.

You could use custom Event from Symfony EventDispatcher dispatched from your TwigComponent as I said, but not sure you'd fine exactly what you want there.

So, i think i do have already answered in fact. Nicely and trying to help as much as possible.

tito10047 commented 3 months ago

Yes, I want use symfony EventDispatcher! But I dont know how. How I can listen event in twig component. I need send symfony event from one component to another, but I think this is not possible.

smnandre commented 3 months ago

A Twig component cannot receive event, so no.

tito10047 commented 3 months ago

Thanks