Bonjour,
je crée actuellement une application PHP avec l'utilisation de Symfony5 et Docker.
j'ai essaye de suivre quelque tutoriel(déprécier) et la documentation mais j'ai beaucoup de mal a mettre le système en place.
j'ai suivi les recommandation de la documentation https://symfony.com/doc/5.4/mercure.html.
j'ai donc installer mercure grâce a la commande :
j'ai ensuite modifier les variable environement:
Code : Sélectionner tout - Visualiser dans une fenêtre à part composer require mercure
.env
j'ai modifier les URL par http au lieu de https car j avais une erreur SSL connect error for “https://127.0.0.1:8000/.well-known/mercure” car je pense que mon application est en http pour le moment et ne genere pas de certificat ssl pour communiquer avec le hub.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 ###> symfony/mercure-bundle ### # See https://symfony.com/doc/current/mercure.html#configuration # The URL of the Mercure hub, used by the app to publish updates (can be a local URL) MERCURE_URL=http://127.0.0.1:8000/.well-known/mercure # The public URL of the Mercure hub, used by the browser to connect MERCURE_PUBLIC_URL=http://127.0.0.1:8000/.well-known/mercure # The secret used to sign the JWTs MERCURE_JWT_SECRET="secret" ###< symfony/mercure-bundle ###
j ai modifié mon MERCURE_JWT_SECRET en utilisant https://jwt.io/ en ajoutant au payload :
et ma clé secrète dans la zone de saisie (VERIFY SIGNATURE) your-256-bit-secret, que j'ai ensuite ajouter à MERCURE_JWT_SECRET.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 { "mercure": { "publish": ["*"] } }
j'ai ensuite crée un fichier js sur la page ou je souhaite recevoir les notifications.
je souhaite envoyer une notification lorsqu'un utilisateur accède a la page http://127.0.0.1:8000/commande/recapitulatif.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 const eventSource = new EventSource('http://127.0.0.1:8000/.well-known/mercure?topic=' + encodeURIComponent('http://127.0.0.1:8000/commande/recapitulatif'), ); eventSource.onmessage = event => { // Will be called every time an update is published by the server alert("Commande"); console.log(JSON.parse(event.data)); }
j'ai donc ajouter ce code dans le contrôleur de la page en question.
ma page qui écoute les notification apparemment me crée bien une connexion avec le hub et renvoie une réponse 200.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 $update = new Update( 'http://127.0.0.1:8000/commande/recapitulatif', json_encode(['status' => 'Commande']) ); $hub->publish($update);
le log de ma page qui recois les notification me donne:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 Request URL: http://127.0.0.1:8000/.well-known/mercure?topic=http%3A%2F%2F127.0.0.1%3A8000%2Fcommande%2Frecapitulatif Request Method: GET Status Code: 200 OK Remote Address: 127.0.0.1:8000 Referrer Policy: strict-origin-when-cross-origin
par contre lorsque j'essaye de me connecter a la page qui dois crée la notification http://127.0.0.1:8000/commande/recapitulatif j'obtiens une erreur <<failed to send an update>> et un autre message <<HTTP/1.1 401 Unauthorized returned for "http://127.0.0.1:8000/.well-known/mercure".>>
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 [Application] Jun 26 17:33:45 |DEBUG | SECURI Stored the security token in the session. key="_security_main" [Web Server ] Jun 26 19:33:45 |INFO | SERVER GET (200) /favicon.ico ip="127.0.0.1" [Application] Jun 26 17:33:46 |INFO | REQUES Matched route "_wdt". method="GET" request_uri="http://127.0.0.1:8000/_wdt/8f2711" route="_wdt" route_parameters={"_controller":"web_profiler.controller.profiler::toolbarAction","_route ":"_wdt","token":"8f2711"} [Web Server ] Jun 26 19:33:47 |INFO | SERVER GET (200) /_wdt/8f2711 ip="127.0.0.1"
j'ai essayer d'ajouter dicovery comme la doc parle afin d'ajouter des autorisations mon envoie enfin je pense.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 [Application] Jun 26 20:11:41 |INFO | HTTP_C Request: "POST http://127.0.0.1:8000/.well-known/mercure" [Application] Jun 26 20:11:41 |INFO | HTTP_C Response: "401 http://127.0.0.1:8000/.well-known/mercure" [Application] Jun 26 20:11:41 |CRITICA| REQUES Uncaught PHP Exception Symfony\Component\Mercure\Exception\RuntimeException: "Failed to send an update." at C:\laragon\www\Projet\Restaurant\RelaisDesVoutes\vendor\symfony\mercure\src\H ub.php line 104 [Application] Jun 26 20:11:41 |DEBUG | SECURI Stored the security token in the session. key="_security_main" [Web Server ] Jun 26 22:11:41 |ERROR | SERVER POST (500) /commande/recapitulatif host="127.0.0.1:8004" ip="127.0.0.1" scheme="https" [Application] Jun 26 20:13:07 |INFO | REQUES Matched route "order_recap". method="POST" request_uri="http://127.0.0.1:8000/commande/recapitulatif" route="order_recap" route_parameters={"_controller":"App\\Controller\\OrderControll er::add","_route":"order_recap"}
et modifier :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 $discovery->addLink($request); $response = new JsonResponse([ '@id' => 'http://127.0.0.1:8000/commande/recapitulatif', 'status' => 'Order', ]); $response->headers->setCookie( $authorization->createCookie($request, ['http://127.0.0.1:8000/commande/recapitulatif']) );
avec true pour ajouter l'authorisation, ainsi que :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 $update = new Update( 'http://127.0.0.1:8000/commande/recapitulatif', json_encode(['status' => 'Commande']), true ); $hub->publish($update);
l'option withCredientials.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 const eventSource = new EventSource('http://127.0.0.1:8000/.well-known/mercure?topic=' + encodeURIComponent('http://127.0.0.1:8000/commande/recapitulatif'), { withCredentials: true } ); eventSource.onmessage = event => { // Will be called every time an update is published by the server alert("Commande"); console.log(JSON.parse(event.data));
maintenant j'obtiens ce log:
Je ne suis absolument pas sur de tous ce que je viens de détailler et j'espère que je ne suis pas trop loin du compte.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 [Application] Jun 26 20:18:13 |INFO | HTTP_C Request: "POST http://127.0.0.1:8000/.well-known/mercure" [Application] Jun 26 20:18:13 |INFO | HTTP_C Response: "401 http://127.0.0.1:8000/.well-known/mercure" [Application] Jun 26 20:18:13 |CRITICA| REQUES Uncaught PHP Exception Symfony\Component\Mercure\Exception\RuntimeException: "Failed to send an update." at C:\laragon\www\Projet\Restaurant\RelaisDesVoutes\vendor\symfony\mercure\src\H ub.php line 104 [Application] Jun 26 20:18:13 |DEBUG | SECURI Stored the security token in the session. key="_security_main" [Web Server ] Jun 26 22:18:14 |ERROR | SERVER POST (500) /commande/recapitulatif host="127.0.0.1:8004" ip="127.0.0.1" scheme="https"
Si vous avez besoin de plus d'information n'hésiter pas a demander.
Si quelqu'un peux m'aider en m'expliquant mon erreur je vous en remercie d'avance.
Partager