Skip to content

Commit a915e36

Browse files
committed
Some refactoring
1 parent 80beb5a commit a915e36

29 files changed

+761
-423
lines changed

README.md

+12-20
Original file line numberDiff line numberDiff line change
@@ -26,44 +26,35 @@ $ composer require endroid/qrcode
2626
use Endroid\QrCode\ErrorCorrectionLevel;
2727
use Endroid\QrCode\LabelAlignment;
2828
use Endroid\QrCode\QrCode;
29-
use Endroid\QrCode\Writer\PngWriter;
30-
use Endroid\QrCode\Writer\SvgWriter;
3129
use Symfony\Component\HttpFoundation\Response;
3230

33-
// Create a QR code
31+
// Create a basic QR code
3432
$qrCode = new QrCode('Life is too short to be generating QR codes');
3533
$qrCode->setSize(300);
3634

3735
// Set advanced options
3836
$qrCode
37+
->setWriterByName('png')
3938
->setMargin(10)
4039
->setEncoding('UTF-8')
4140
->setErrorCorrectionLevel(ErrorCorrectionLevel::HIGH)
4241
->setForegroundColor(['r' => 0, 'g' => 0, 'b' => 0])
4342
->setBackgroundColor(['r' => 255, 'g' => 255, 'b' => 255])
4443
->setLabel('Scan the code', 16, __DIR__.'/../assets/noto_sans.otf', LabelAlignment::CENTER)
4544
->setLogoPath(__DIR__.'/../assets/symfony.png')
46-
->setLogoSize(150)
45+
->setLogoWidth(150)
4746
->setValidateResult(true)
4847
;
4948

50-
// Output the QR code
51-
header('Content-Type: '.$qrCode->getContentType(PngWriter::class));
52-
echo $qrCode->writeString(PngWriter::class);
49+
// Directly output the QR code
50+
header('Content-Type: '.$qrCode->getContentType());
51+
echo $qrCode->writeString();
5352

54-
// Save it to a file (guesses writer by file extension)
53+
// Save it to a file
5554
$qrCode->writeFile(__DIR__.'/qrcode.png');
5655

5756
// Create a response object
58-
$response = new Response(
59-
$qrCode->writeString(SvgWriter::class),
60-
Response::HTTP_OK,
61-
['Content-Type' => $qrCode->getContentType(SvgWriter::class)])
62-
;
63-
64-
// Work via the writer
65-
$writer = new PngWriter($qrCode);
66-
$pngData = $writer->writeString();
57+
$response = new Response($qrCode->writeString(), Response::HTTP_OK, ['Content-Type' => $qrCode->getContentType()]);
6758
```
6859

6960
![QR Code](http://endroid.nl/qrcode/Dit%20is%20een%20test.png)
@@ -89,6 +80,7 @@ applied by the factory can optionally be overridden via the configuration.
8980

9081
```yaml
9182
endroid_qr_code:
83+
writer: 'png'
9284
size: 300
9385
margin: 10
9486
foreground_color: { r: 0, g: 0, b: 0 }
@@ -100,7 +92,7 @@ endroid_qr_code:
10092
label_alignment: left # left, center or right
10193
label_margin: { b: 20 }
10294
logo_path: '%kernel.root_dir%/../vendor/endroid/qrcode/assets/symfony.png'
103-
logo_size: 150
95+
logo_width: 150
10496
validate_result: true # checks if the result is readable
10597
```
10698
@@ -136,8 +128,8 @@ defaults defined by the bundle or set via your configuration.
136128

137129
``` twig
138130
<img src="{{ qrcode_path(message) }}" />
139-
<img src="{{ qrcode_url(message, { extension: 'svg' }) }}" />
140-
<img src="{{ qrcode_data_uri(message, { extension: 'svg', size: 150 }) }}" />
131+
<img src="{{ qrcode_url(message, { writer: 'eps' }) }}" />
132+
<img src="{{ qrcode_data_uri(message, { writer: 'svg', size: 150 }) }}" />
141133
```
142134

143135
## Versioning

composer.json

-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
"ext-gd": "*",
1818
"symfony/options-resolver": "^2.7|^3.0",
1919
"bacon/bacon-qr-code": "^1.0",
20-
"myclabs/php-enum": "^1.5",
2120
"khanamiryan/qrcode-detector-decoder": "^0.0.1",
2221
"symfony/property-access": "^2.7|^3.0"
2322
},

src/Bundle/Controller/QrCodeController.php

+7-9
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
use Endroid\QrCode\Factory\QrCodeFactory;
1313
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
14+
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
1415
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
1516
use Symfony\Component\HttpFoundation\Response;
1617
use Symfony\Component\HttpFoundation\Request;
@@ -33,25 +34,22 @@ public function generateAction(Request $request, $text, $extension)
3334
$options = $request->query->all();
3435

3536
$qrCode = $this->getQrCodeFactory()->create($text, $options);
36-
$writer = $qrCode->getWriterByExtension($extension);
37+
$qrCode->setWriterByExtension($extension);
3738

38-
return new Response(
39-
$writer->writeString(),
40-
Response::HTTP_OK,
41-
['Content-Type' => $writer->getContentType()]
42-
);
39+
return new Response($qrCode->writeString(), Response::HTTP_OK, ['Content-Type' => $qrCode->getContentType()]);
4340
}
4441

4542
/**
4643
* @Route("/twig", name="endroid_qrcode_twig_functions")
44+
* @Template()
4745
*
48-
* @return Response
46+
* @return array
4947
*/
5048
public function twigFunctionsAction()
5149
{
52-
return $this->render('twig_functions.html.twig', [
50+
return [
5351
'message' => 'QR Code'
54-
]);
52+
];
5553
}
5654

5755
/**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php
2+
3+
/*
4+
* (c) Jeroen van den Enden <[email protected]>
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+
10+
namespace Endroid\QrCode\Bundle\DependencyInjection\Compiler;
11+
12+
use Endroid\QrCode\ErrorCorrectionLevel;
13+
use Endroid\QrCode\LabelAlignment;
14+
use Endroid\QrCode\QrCode;
15+
use Predis\Response\Error;
16+
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
17+
use Symfony\Component\Config\Definition\ConfigurationInterface;
18+
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
19+
use Symfony\Component\DependencyInjection\ContainerBuilder;
20+
use Symfony\Component\DependencyInjection\Reference;
21+
22+
class WriterRegistryCompilerPass implements CompilerPassInterface
23+
{
24+
/**
25+
* {@inheritdoc}
26+
*/
27+
public function process(ContainerBuilder $container)
28+
{
29+
if (!$container->has('endroid.qrcode.writer_registry')) {
30+
return;
31+
}
32+
33+
$writerRegistryDefinition = $container->findDefinition('endroid.qrcode.writer_registry');
34+
35+
$taggedServices = $container->findTaggedServiceIds('endroid.qrcode.writer');
36+
foreach ($taggedServices as $id => $tags) {
37+
foreach ($tags as $attributes) {
38+
$writerRegistryDefinition->addMethodCall('addWriter', [new Reference($id), isset($attributes['set_as_default']) && $attributes['set_as_default']]);
39+
}
40+
}
41+
}
42+
}

src/Bundle/DependencyInjection/Configuration.php

+3-2
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ public function getConfigTreeBuilder()
2525
$treeBuilder
2626
->root('endroid_qr_code')
2727
->children()
28+
->scalarNode('writer')->end()
2829
->integerNode('size')->min(0)->end()
2930
->integerNode('margin')->min(0)->end()
3031
->scalarNode('encoding')->defaultValue('UTF-8')->end()
@@ -48,6 +49,8 @@ public function getConfigTreeBuilder()
4849
->scalarNode('b')->isRequired()->end()
4950
->end()
5051
->end()
52+
->scalarNode('logo_path')->end()
53+
->integerNode('logo_width')->end()
5154
->scalarNode('label')->end()
5255
->integerNode('label_font_size')->end()
5356
->scalarNode('label_font_path')->end()
@@ -65,8 +68,6 @@ public function getConfigTreeBuilder()
6568
->scalarNode('l')->end()
6669
->end()
6770
->end()
68-
->scalarNode('logo_path')->end()
69-
->integerNode('logo_size')->end()
7071
->booleanNode('validate_result')->end()
7172
->end()
7273
->end()

src/Bundle/DependencyInjection/EndroidQrCodeExtension.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,6 @@ public function load(array $configs, ContainerBuilder $container)
2929
$loader->load('services.yml');
3030

3131
$factoryDefinition = $container->getDefinition('endroid.qrcode.factory');
32-
$factoryDefinition->setArguments([$config]);
32+
$factoryDefinition->replaceArgument(0, $config);
3333
}
3434
}

src/Bundle/EndroidQrCodeBundle.php

+9
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,17 @@
99

1010
namespace Endroid\QrCode\Bundle;
1111

12+
use Endroid\QrCode\Bundle\DependencyInjection\Compiler\WriterRegistryCompilerPass;
13+
use Symfony\Component\DependencyInjection\ContainerBuilder;
1214
use Symfony\Component\HttpKernel\Bundle\Bundle;
1315

1416
class EndroidQrCodeBundle extends Bundle
1517
{
18+
/**
19+
* {@inheritdoc}
20+
*/
21+
public function build(ContainerBuilder $container)
22+
{
23+
$container->addCompilerPass(new WriterRegistryCompilerPass());
24+
}
1625
}
+23-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,31 @@
11
services:
22
endroid.qrcode.factory:
33
class: Endroid\QrCode\Factory\QrCodeFactory
4-
4+
arguments: [ null, '@endroid.qrcode.writer_registry' ]
55
endroid.qrcode.twig.extension:
66
class: Endroid\QrCode\Twig\Extension\QrCodeExtension
77
arguments: [ '@endroid.qrcode.factory', '@router']
88
tags:
99
- { name: twig.extension }
10+
endroid.qrcode.writer_registry:
11+
class: Endroid\QrCode\WriterRegistry
12+
endroid.qrcode.writer.binary_writer:
13+
class: Endroid\QrCode\Writer\BinaryWriter
14+
tags:
15+
- { name: endroid.qrcode.writer }
16+
endroid.qrcode.writer.debug_writer:
17+
class: Endroid\QrCode\Writer\DebugWriter
18+
tags:
19+
- { name: endroid.qrcode.writer }
20+
endroid.qrcode.writer.eps_writer:
21+
class: Endroid\QrCode\Writer\EpsWriter
22+
tags:
23+
- { name: endroid.qrcode.writer }
24+
endroid.qrcode.writer.png_writer:
25+
class: Endroid\QrCode\Writer\PngWriter
26+
tags:
27+
- { name: endroid.qrcode.writer, set_as_default: true }
28+
endroid.qrcode.writer.svg_writer:
29+
class: Endroid\QrCode\Writer\SvgWriter
30+
tags:
31+
- { name: endroid.qrcode.writer }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<img src="{{ qrcode_path(message) }}" />
2+
<img src="{{ qrcode_url(message, { writer: 'svg' }) }}" />
3+
<img src="{{ qrcode_data_uri(message, { writer: 'svg', size: 150 }) }}" />

src/Factory/QrCodeFactory.php

+21-6
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,8 @@
99

1010
namespace Endroid\QrCode\Factory;
1111

12-
use Endroid\QrCode\ErrorCorrectionLevel;
13-
use Endroid\QrCode\LabelAlignment;
1412
use Endroid\QrCode\QrCode;
15-
use Symfony\Component\OptionsResolver\Options;
13+
use Endroid\QrCode\WriterRegistryInterface;
1614
use Symfony\Component\OptionsResolver\OptionsResolver;
1715
use Symfony\Component\PropertyAccess\PropertyAccess;
1816

@@ -22,19 +20,20 @@ class QrCodeFactory
2220
* @var array
2321
*/
2422
protected $definedOptions = [
23+
'writer',
2524
'size',
2625
'margin',
2726
'foreground_color',
2827
'background_color',
2928
'encoding',
3029
'error_correction_level',
30+
'logo_path',
31+
'logo_width',
3132
'label',
3233
'label_font_size',
3334
'label_font_path',
3435
'label_alignment',
3536
'label_margin',
36-
'logo_path',
37-
'logo_size',
3837
'validate_result'
3938
];
4039

@@ -43,17 +42,24 @@ class QrCodeFactory
4342
*/
4443
protected $defaultOptions;
4544

45+
/**
46+
* @var WriterRegistryInterface
47+
*/
48+
protected $writerRegistry;
49+
4650
/**
4751
* @var OptionsResolver
4852
*/
4953
protected $optionsResolver;
5054

5155
/**
5256
* @param array $defaultOptions
57+
* @param WriterRegistryInterface $writerRegistry
5358
*/
54-
public function __construct(array $defaultOptions = [])
59+
public function __construct(array $defaultOptions = [], WriterRegistryInterface $writerRegistry = null)
5560
{
5661
$this->defaultOptions = $defaultOptions;
62+
$this->writerRegistry = $writerRegistry;
5763
}
5864

5965
/**
@@ -67,8 +73,17 @@ public function create($text = '', array $options = [])
6773
$accessor = PropertyAccess::createPropertyAccessor();
6874

6975
$qrCode = new QrCode($text);
76+
77+
if ($this->writerRegistry instanceof WriterRegistryInterface) {
78+
$qrCode->setWriterRegistry($this->writerRegistry);
79+
}
80+
7081
foreach ($this->definedOptions as $option) {
7182
if (isset($options[$option])) {
83+
if ($option === 'writer') {
84+
$options['writer_by_name'] = $options[$option];
85+
$option = 'writer_by_name';
86+
}
7287
$accessor->setValue($qrCode, $option, $options[$option]);
7388
}
7489
}

0 commit comments

Comments
 (0)