<?php
namespace App\EventSubscriber;
use ApiPlatform\Core\EventListener\EventPriorities;
use App\Entity\LearningAgreement;
use App\LearningAgreement\Enum\LearningAgreementStatus;
use App\Pdf\Pdf;
use JetBrains\PhpStorm\ArrayShape;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Event\ViewEvent;
use Symfony\Component\HttpKernel\KernelEvents;
class LearningAgreementWriteSubscriber implements EventSubscriberInterface
{
private Pdf $pdf;
public function __construct(
Pdf $pdf,
) {
$this->pdf = $pdf;
}
#[ArrayShape([KernelEvents::VIEW => 'array'])]
public static function getSubscribedEvents(): array
{
return [
KernelEvents::VIEW => [
'generateLaPdf', EventPriorities::PRE_WRITE,
],
];
}
public function generateLaPdf(ViewEvent $viewEvent): void
{
$entity = $viewEvent->getControllerResult();
$method = $viewEvent->getRequest()->getMethod();
if (
!$entity instanceof LearningAgreement
|| !in_array(
$method,
[
Request::METHOD_POST,
Request::METHOD_PATCH,
Request::METHOD_PUT,
]
)
) {
return;
}
// Only regenerate PDF if the learning agreement's status is ACCEPTED_BY_RECEIVING
if (LearningAgreementStatus::ACCEPTED_BY_RECEIVING === $entity->getStatus()) {
$pdfName = 'Learning agreement - '.$entity->getMobility()->getId().'.pdf';
$pdfPathSubDirectory = 'learning_agreement';
// Generate PDF according to LA's data
$relativePathWithName = $this->pdf->generateFromHtml(
$pdfName,
$pdfPathSubDirectory,
'pdf/learning_agreement_pdf.html.twig',
[
'learningAgreement' => $entity,
]
);
// Save PDF url to LA if changed
$entity->setPdf($relativePathWithName);
}
}
}