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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
composer require mercure
j'ai ensuite modifier les variable environement:
.env
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 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.

j ai modifié mon MERCURE_JWT_SECRET en utilisant https://jwt.io/ en ajoutant au payload :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
{
  "mercure": {
    "publish": ["*"]
  }
}
et ma clé secrète dans la zone de saisie (VERIFY SIGNATURE) your-256-bit-secret, que j'ai ensuite ajouter à MERCURE_JWT_SECRET.


j'ai ensuite crée un fichier js sur la page ou je souhaite recevoir les notifications.

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));
}
je souhaite envoyer une notification lorsqu'un utilisateur accède a la page http://127.0.0.1:8000/commande/recapitulatif.

j'ai donc ajouter ce code dans le contrôleur de la page en question.

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);
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
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
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
[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"
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
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"}
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
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'])
            );
et modifier :

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);
avec true pour ajouter l'authorisation, ainsi que :

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));
l'option withCredientials.

maintenant j'obtiens ce log:

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"
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.
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.