vendor/endroid/qr-code/src/Factory/QrCodeFactory.php line 56

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. /*
  4. * (c) Jeroen van den Enden <info@endroid.nl>
  5. *
  6. * This source file is subject to the MIT license that is bundled
  7. * with this source code in the file LICENSE.
  8. */
  9. namespace Endroid\QrCode\Factory;
  10. use Endroid\QrCode\ErrorCorrectionLevel;
  11. use Endroid\QrCode\Exception\ValidationException;
  12. use Endroid\QrCode\QrCode;
  13. use Endroid\QrCode\QrCodeInterface;
  14. use Endroid\QrCode\WriterRegistryInterface;
  15. use Symfony\Component\OptionsResolver\OptionsResolver;
  16. use Symfony\Component\PropertyAccess\PropertyAccess;
  17. class QrCodeFactory implements QrCodeFactoryInterface
  18. {
  19. private $writerRegistry;
  20. /** @var OptionsResolver */
  21. private $optionsResolver;
  22. /** @var array<string, mixed> */
  23. private $defaultOptions;
  24. /** @var array<int, string> */
  25. private $definedOptions = [
  26. 'writer',
  27. 'writer_options',
  28. 'size',
  29. 'margin',
  30. 'foreground_color',
  31. 'background_color',
  32. 'encoding',
  33. 'round_block_size',
  34. 'round_block_size_mode',
  35. 'error_correction_level',
  36. 'logo_path',
  37. 'logo_width',
  38. 'logo_height',
  39. 'label',
  40. 'label_font_size',
  41. 'label_font_path',
  42. 'label_alignment',
  43. 'label_margin',
  44. 'validate_result',
  45. ];
  46. /** @param array<string, mixed> $defaultOptions */
  47. public function __construct(array $defaultOptions = [], WriterRegistryInterface $writerRegistry = null)
  48. {
  49. $this->defaultOptions = $defaultOptions;
  50. $this->writerRegistry = $writerRegistry;
  51. }
  52. public function create(string $text = '', array $options = []): QrCodeInterface
  53. {
  54. $options = $this->getOptionsResolver()->resolve($options);
  55. $accessor = PropertyAccess::createPropertyAccessor();
  56. $qrCode = new QrCode($text);
  57. if ($this->writerRegistry instanceof WriterRegistryInterface) {
  58. $qrCode->setWriterRegistry($this->writerRegistry);
  59. }
  60. foreach ($this->definedOptions as $option) {
  61. if (isset($options[$option])) {
  62. if ('writer' === $option) {
  63. $options['writer_by_name'] = $options[$option];
  64. $option = 'writer_by_name';
  65. }
  66. if ('error_correction_level' === $option) {
  67. $options[$option] = new ErrorCorrectionLevel($options[$option]);
  68. }
  69. $accessor->setValue($qrCode, $option, $options[$option]);
  70. }
  71. }
  72. if (!$qrCode instanceof QrCodeInterface) {
  73. throw new ValidationException('QR Code was messed up by property accessor');
  74. }
  75. return $qrCode;
  76. }
  77. private function getOptionsResolver(): OptionsResolver
  78. {
  79. if (!$this->optionsResolver instanceof OptionsResolver) {
  80. $this->optionsResolver = $this->createOptionsResolver();
  81. }
  82. return $this->optionsResolver;
  83. }
  84. private function createOptionsResolver(): OptionsResolver
  85. {
  86. $optionsResolver = new OptionsResolver();
  87. $optionsResolver
  88. ->setDefaults($this->defaultOptions)
  89. ->setDefined($this->definedOptions)
  90. ;
  91. return $optionsResolver;
  92. }
  93. }