Bonjour
Je veux générer des fichiers pdf en utilisant le composant messenger de Symfony et KnpSnappyBundle. ALors toutes la config est parfaite. J'arrive à envoyer un message au bus.
Mais lors de la capture du message (handler), j'obtiens cette erreur qui dit qu"on ne trouve pas une variable:
08:37:01 INFO [messenger] Received message App\Message\GeneratePDF ["message" => App\Message\GeneratePDF^ { …},"class" => "App\Message\GeneratePDF"]
08:37:01 ERROR [messenger] Error thrown while handling message App\Message\GeneratePDF. Sending for retry #1 using 1000 ms delay. Error: "Impossible to access an attribute ("schemeAndHttpHost") on a null variable." ["message" => App\Message\GeneratePDF^ { …},"class" => "App\Message\GeneratePDF","retryCount" => 1,"delay" => 1000,"error" => "Impossible to access an attribute ("schemeAndHttpHost") on a null variable.","exception" => Symfony\Component\Messenger\Exception\HandlerFailedException^ { …}]
08:37:02 INFO [messenger] Received message App\Message\GeneratePDF ["message" => App\Message\GeneratePDF^ { …},"class" => "App\Message\GeneratePDF"]
08:37:02 ERROR [messenger] Error thrown while handling message App\Message\GeneratePDF. Sending for retry #2 using 2000 ms delay. Error: "Impossible to access an attribute ("schemeAndHttpHost") on a null variable." ["message" => App\Message\GeneratePDF^ { …},"class" => "App\Message\GeneratePDF","retryCount" => 2,"delay" => 2000,"error" => "Impossible to access an attribute ("schemeAndHttpHost") on a null variable.","exception" => Symfony\Component\Messenger\Exception\HandlerFailedException^ { …}]
08:37:04 INFO [messenger] Received message App\Message\GeneratePDF ["message" => App\Message\GeneratePDF^ { …},"class" => "App\Message\GeneratePDF"]
08:37:04 ERROR [messenger] Error thrown while handling message App\Message\GeneratePDF. Sending for retry #3 using 4000 ms delay. Error: "Impossible to access an attribute ("schemeAndHttpHost") on a null variable." ["message" => App\Message\GeneratePDF^ { …},"class" => "App\Message\GeneratePDF","retryCount" => 3,"delay" => 4000,"error" => "Impossible to access an attribute ("schemeAndHttpHost") on a null variable.","exception" => Symfony\Component\Messenger\Exception\HandlerFailedException^ { …}]
08:37:08 INFO [messenger] Received message App\Message\GeneratePDF ["message" => App\Message\GeneratePDF^ { …},"class" => "App\Message\GeneratePDF"]
08:37:08 CRITICAL [messenger] Error thrown while handling message App\Message\GeneratePDF. Removing from transport after 3 retries. Error: "Impossible to access an attribute ("schemeAndHttpHost") on a null variable." ["message" => App\Message\GeneratePDF^ { …},"class" => "App\Message\GeneratePDF","retryCount" => 3,"error" => "Impossible to access an attribute ("schemeAndHttpHost") on a null variable.","exception" => Symfony\Component\Messenger\Exception\HandlerFailedException^ { …}]
Je vous donne ma config et mon code.
Config en environnement de dev
Symfony 5.1.11
Messenger 5.1.11
KnpSnappyBundle 1.8.0
MySQL5.7.32
Php 7.4.20
Code
messenger.yaml
framework:
messenger:
# Uncomment this (and the failed transport below) to send failed messages to this transport for later handling.
# failure_transport: failed
transports:
# https://symfony.com/doc/current/messenger.html#transport-configuration
async: '%env(MESSENGER_TRANSPORT_DSN)%'
# failed: 'doctrine://default?queue_name=failed'
# sync: 'sync://'
routing:
# Route your messages to the transports
'App\Message\GeneratePDF': async
App\Message\GeneratePDF
<?php
namespace App\Message;
class GeneratePDF
{
private $classeId;
private $as;
private $regime;
private $annexeId;
public function __construct(int $classeId, int $as, string $regime, int $annexeId){
$this->classeId = $classeId;
$this->as = $as;
$this->regime = $regime;
$this->annexeId = $annexeId;
}
public function getAnnexeId()
{
return $this->annexeId;
}
public function getRegime()
{
return $this->regime;
}
public function getClasseId()
{
return $this->classeId;
}
public function getAs()
{
return $this->as;
}
}
App\MessageHandler\GeneratePDFHandler
<?php
namespace App\MessageHandler;
use Knp\Snappy\Pdf;
use App\Entity\Annee;
use App\Entity\Eleve;
use App\Entity\Annexe;
use App\Entity\Classe;
use App\Message\GeneratePDF;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Messenger\Handler\MessageHandlerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
class GeneratePDFHandler extends AbstractController implements MessageHandlerInterface
{
private $manager;
private $snappy;
public function __construct(EntityManagerInterface $manager, Pdf $snappy){
$this->manager = $manager;
$this->snappy = $snappy;
}
public function __invoke(GeneratePDF $message)
{
$repoEleve = $this->manager->getRepository(Eleve ::class);
$repoClasse = $this->manager->getRepository(Classe::class);
$repoAnnee = $this->manager->getRepository(Annee ::class);
$repoAnnexe = $this->manager->getRepository(Annexe::class);
$annexe = $repoAnnexe->find($message->getAnnexeId());
$annee = $repoAnnee->find($message->getAs());
$classe = $repoClasse->find($message->getClasseId());
$eleves = $repoEleve->minimumInformationsElevesDUneClasse($message->getClasseId());
$dateNaissanceAr = [];
foreach ($eleves as $eleve) {
$dateNaissanceAr[$eleve["id"]] = $this->arabic_w2e($eleve["dateNaissance"]);
}
$libelleAnneeAr = $this->arabic_w2e($annee->getLibelle());
$filename = "liste-de-classe-de-".$classe->getLibelleFr();
$options = [
'orientation' => 'portrait',
'enable-javascript' => false,
'javascript-delay' => 1000,
'no-stop-slow-scripts' => true,
'background' => true,
'lowquality' => false,
'page-width' => 86,
'page-height' => 54,
'margin-bottom' => 0,
'margin-left' => 0,
'margin-right' => 0,
'margin-top' => 0,
'encoding' => 'utf-8',
'images' => true,
'cookie' => array(),
'dpi' => 300,
'enable-external-links' => false,
'enable-internal-links' => false,
];
$expiration = "Mai 2022";
$html = $this->renderView('direction-scolarite/scolarite/cartes-scolaires.html.twig', [
"annee" => $annee,
"classe" => $classe,
"eleves" => $eleves,
'annexe' => $annexe,
'expiration' => $expiration,
'dateNaissanceAr' => $dateNaissanceAr,
'libelleAnneeAr' => $libelleAnneeAr,
'server' => $_SERVER["DOCUMENT_ROOT"],
]);
// $this->snappy->getOutputFromHtml($html, $options);
return new Response(
$this->snappy->getOutputFromHtml($html, $options),
200,
[
'Content-Type' => 'application/pdf',
'Content-Disposition' => 'inline; filename="'.$filename.'.pdf"'
]
);
}
public function arabic_w2e($str)
{
$arabic_eastern = array('٠', '١', '٢', '٣', '٤', '٥', '٦', '٧', '٨', '٩');
$arabic_western = array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9');
return str_replace($arabic_western, $arabic_eastern, $str);
}
}
Logique métier
/**
* @Security("is_granted('ROLE_SCOLARITE') or is_granted('ROLE_SCOLARITE_ANNEXE')")
* @Route("/cartes-scolaires-des-eleves-d-une-classe-{as}-{regime}-{classeId}-{annexeId}", name="isi_cartes_scolaires_d_une_classe")
*/
public function cartesScolaireDesEleves(EntityManagerInterface $manager, int $as, string $regime, int $classeId, int $annexeId)
{
$repoAnnexe = $manager->getRepository(Annexe::class);
$annexe = $repoAnnexe->find($annexeId);
if(!in_array($annexeId, $this->getUser()->idsAnnexes()) or (in_array($annexeId, $this->getUser()->idsAnnexes()) and $this->getUser()->findAnnexe($annexeId)->getDisabled() == 1)){
$this->addFlash('danger', 'Vous n\'êtes pas autorisés à exploiter les données de l\'annexe <strong>'.$annexe->getLibelle().'</strong>.');
return $this->redirect($this->generateUrl('annexes_homepage', ['as' => $as]));
}
$this->dispatchMessage(new GeneratePDF($classeId, $as, $regime, $annexeId));
return $this->redirectToRoute('isi_gestion_classes', ["as" => $as, "regime" => $regime, "annexeId" => $annexeId]);
}
.env
MESSENGER_TRANSPORT_DSN=doctrine://default
Pourriez-vous me dire ce que je dois faire pour résoudre le problème ?
Désolé pour ce long sujet, mais je tenais à mettre à disposition tout le nécessaire.