| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 | <?phpdeclare(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;    }}
 |