123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- <?php
- declare(strict_types=1);
- /*
- * (c) Jeroen van den Enden <info@endroid.nl>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
- namespace Endroid\QrCode\Factory;
- use Endroid\QrCode\ErrorCorrectionLevel;
- use Endroid\QrCode\Exception\ValidationException;
- use Endroid\QrCode\QrCode;
- use Endroid\QrCode\QrCodeInterface;
- use Endroid\QrCode\WriterRegistryInterface;
- use Symfony\Component\OptionsResolver\OptionsResolver;
- use Symfony\Component\PropertyAccess\PropertyAccess;
- class QrCodeFactory implements QrCodeFactoryInterface
- {
- private $writerRegistry;
- /** @var OptionsResolver */
- private $optionsResolver;
- private $defaultOptions;
- /** @var array */
- private $definedOptions = [
- 'writer',
- 'writer_options',
- 'size',
- 'margin',
- 'foreground_color',
- 'background_color',
- 'encoding',
- 'round_block_size',
- 'error_correction_level',
- 'logo_path',
- 'logo_width',
- 'logo_height',
- 'label',
- 'label_font_size',
- 'label_font_path',
- 'label_alignment',
- 'label_margin',
- 'validate_result',
- ];
- public function __construct(array $defaultOptions = [], WriterRegistryInterface $writerRegistry = null)
- {
- $this->defaultOptions = $defaultOptions;
- $this->writerRegistry = $writerRegistry;
- }
- public function create(string $text = '', array $options = []): QrCodeInterface
- {
- $options = $this->getOptionsResolver()->resolve($options);
- $accessor = PropertyAccess::createPropertyAccessor();
- $qrCode = new QrCode($text);
- if ($this->writerRegistry instanceof WriterRegistryInterface) {
- $qrCode->setWriterRegistry($this->writerRegistry);
- }
- foreach ($this->definedOptions as $option) {
- if (isset($options[$option])) {
- if ('writer' === $option) {
- $options['writer_by_name'] = $options[$option];
- $option = 'writer_by_name';
- }
- if ('error_correction_level' === $option) {
- $options[$option] = new ErrorCorrectionLevel($options[$option]);
- }
- $accessor->setValue($qrCode, $option, $options[$option]);
- }
- }
- if (!$qrCode instanceof QrCodeInterface) {
- throw new ValidationException('QR Code was messed up by property accessor');
- }
- return $qrCode;
- }
- private function getOptionsResolver(): OptionsResolver
- {
- if (!$this->optionsResolver instanceof OptionsResolver) {
- $this->optionsResolver = $this->createOptionsResolver();
- }
- return $this->optionsResolver;
- }
- private function createOptionsResolver(): OptionsResolver
- {
- $optionsResolver = new OptionsResolver();
- $optionsResolver
- ->setDefaults($this->defaultOptions)
- ->setDefined($this->definedOptions)
- ;
- return $optionsResolver;
- }
- }
|