Browse Source

implements support design for encoders

Olivier Massot 3 years ago
parent
commit
7e6c467c3c

+ 4 - 0
config/services.yaml

@@ -38,6 +38,8 @@ services:
             tags: ['app.optionalsroles']
             tags: ['app.optionalsroles']
         App\Service\Export\ExporterInterface:
         App\Service\Export\ExporterInterface:
             tags: ['app.exporter']
             tags: ['app.exporter']
+        App\Service\Export\Encoder\EncoderInterface:
+            tags: ['app.encoder']
 
 
     App\Doctrine\Access\HandleCurrentAccessExtension:
     App\Doctrine\Access\HandleCurrentAccessExtension:
         - !tagged_iterator app.extensions.access
         - !tagged_iterator app.extensions.access
@@ -45,6 +47,8 @@ services:
         - !tagged_iterator app.optionalsroles
         - !tagged_iterator app.optionalsroles
     App\Service\Export\ExporterHandler:
     App\Service\Export\ExporterHandler:
         - !tagged_iterator app.exporter
         - !tagged_iterator app.exporter
+    App\Service\Export\Encoder\EncoderHandler:
+        - !tagged_iterator app.encoder
 
 
     #########################################
     #########################################
     ##  SERIALIZER Decorates ##
     ##  SERIALIZER Decorates ##

+ 38 - 0
src/Service/Export/Encoder/EncoderHandler.php

@@ -0,0 +1,38 @@
+<?php
+
+namespace App\Service\Export\Encoder;
+
+use App\ApiResources\Export\ExportRequest;
+use Exception;
+
+/**
+ * Permet d'itérer sur les services d'encodage
+ */
+class EncoderHandler
+{
+    /**
+     * Pour l'injection des services, voir config/services.yaml, section 'TAG Services'
+     * @param iterable $encoders
+     */
+    public function __construct(
+        private iterable $encoders,
+    ) {}
+
+    /**
+     * Itère sur les services d'encodage disponibles et
+     * retourne le premier qui supporte ce type de requête.
+     *
+     * @param ExportRequest $exportRequest
+     * @return EncoderInterface
+     * @throws Exception
+     */
+    public function getEncoderFor(ExportRequest $exportRequest): EncoderInterface
+    {
+        /** @var EncoderInterface $encoder */
+        foreach ($this->encoders as $encoder){
+            if($encoder->support($exportRequest))
+                return $encoder;
+        }
+        throw new Exception('no encoder found for this export request');
+    }
+}

+ 14 - 0
src/Service/Export/Encoder/EncoderInterface.php

@@ -0,0 +1,14 @@
+<?php
+
+namespace App\Service\Export\Encoder;
+
+use App\ApiResources\Export\ExportRequest;
+
+interface EncoderInterface
+{
+    public function support(ExportRequest $exportRequest): bool;
+
+    public function encode(string $html, array $options = []);
+
+    public function encodeToFile(string $html, string $path, array $options = []);
+}

+ 7 - 1
src/Service/Export/Encoder/PdfEncoder.php

@@ -3,12 +3,14 @@ declare(strict_types=1);
 
 
 namespace App\Service\Export\Encoder;
 namespace App\Service\Export\Encoder;
 
 
+use App\ApiResources\Export\ExportRequest;
+use App\Enum\Export\ExportFormatEnum;
 use \Knp\Snappy\Pdf;
 use \Knp\Snappy\Pdf;
 
 
 /**
 /**
  * Encode HTML to PDF
  * Encode HTML to PDF
  */
  */
-class PdfEncoder
+class PdfEncoder implements EncoderInterface
 {
 {
     /**
     /**
      * Default encoding options
      * Default encoding options
@@ -29,6 +31,10 @@ class PdfEncoder
         private Pdf $knpSnappy
         private Pdf $knpSnappy
     ) {}
     ) {}
 
 
+    public function support(ExportRequest $exportRequest): bool {
+        return $exportRequest->getFormat() === ExportFormatEnum::PDF()->getValue();
+    }
+
     /**
     /**
      * Default encoding options
      * Default encoding options
      * @return array
      * @return array

+ 4 - 3
src/Service/Export/LicenceCmfExporter.php

@@ -5,11 +5,11 @@ namespace App\Service\Export;
 
 
 use App\ApiResources\Export\ExportRequest;
 use App\ApiResources\Export\ExportRequest;
 use App\ApiResources\Export\LicenceCmf\LicenceCmfOrganizationER;
 use App\ApiResources\Export\LicenceCmf\LicenceCmfOrganizationER;
+use App\Service\Export\Encoder\EncoderHandler;
 use App\Service\Export\Model\LicenceCmf;
 use App\Service\Export\Model\LicenceCmf;
 use App\Enum\Access\FunctionEnum;
 use App\Enum\Access\FunctionEnum;
 use App\Repository\Access\AccessRepository;
 use App\Repository\Access\AccessRepository;
 use App\Repository\Organization\OrganizationRepository;
 use App\Repository\Organization\OrganizationRepository;
-use App\Service\Export\Encoder\PdfEncoder;
 use App\Service\Storage\TemporaryFileStorage;
 use App\Service\Storage\TemporaryFileStorage;
 use App\Service\Utils\Path;
 use App\Service\Utils\Path;
 use Twig\Environment;
 use Twig\Environment;
@@ -31,7 +31,7 @@ class LicenceCmfExporter implements ExporterInterface
         private OrganizationRepository $organizationRepository,
         private OrganizationRepository $organizationRepository,
         private AccessRepository $accessRepository,
         private AccessRepository $accessRepository,
         private Environment $twig,
         private Environment $twig,
-        private PdfEncoder $pdfEncoder
+        private EncoderHandler $encoderHandler
     )
     )
     {}
     {}
 
 
@@ -101,7 +101,8 @@ class LicenceCmfExporter implements ExporterInterface
             unlink($tempPath);
             unlink($tempPath);
         }
         }
 
 
-        $this->pdfEncoder->encodeToFile($html, $tempPath);
+        $encoder = $this->encoderHandler->getEncoderFor($exportRequest);
+        $encoder->encodeToFile($html, $tempPath);
 
 
     }
     }