Skip to content

Commit cef5581

Browse files
author
Jannik Zschiesche
authored
Merge pull request #34 from Becklyn/next
Properly wire specialized file types + fix circular dependency issue
2 parents de9e387 + 231b08e commit cef5581

File tree

12 files changed

+121
-46
lines changed

12 files changed

+121
-46
lines changed

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1+
2.6.5
2+
=====
3+
4+
* (bug) Fixed a circular dependency issue.
5+
* (improvement) The specialized file types are now properly autowired.
6+
* (internal) Bump required Symfony version to 4.3+
7+
8+
19
2.6.4
210
=====
311

composer.json

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,15 @@
2121
"ext-json": "*",
2222
"becklyn/html-builder": "^2.0",
2323
"psr/cache": "^1.0",
24-
"symfony/config": "^4.2 || ^5.0",
25-
"symfony/console": "^4.2 || ^5.0",
26-
"symfony/dependency-injection": "^4.2 || ^5.0",
27-
"symfony/filesystem": "^4.2 || ^5.0",
28-
"symfony/finder": "^4.2 || ^5.0",
29-
"symfony/http-kernel": "^4.2 || ^5.0",
24+
"symfony/config": "^4.3 || ^5.0",
25+
"symfony/console": "^4.3 || ^5.0",
26+
"symfony/dependency-injection": "^4.3 || ^5.0",
27+
"symfony/filesystem": "^4.3 || ^5.0",
28+
"symfony/finder": "^4.3 || ^5.0",
29+
"symfony/http-kernel": "^4.3 || ^5.0",
3030
"symfony/mime": "^4.3 || ^5.0",
31-
"symfony/process": "^4.2 || ^5.0",
32-
"symfony/routing": "^4.2 || ^5.0",
31+
"symfony/process": "^4.3 || ^5.0",
32+
"symfony/routing": "^4.3 || ^5.0",
3333
"symfony/service-contracts": "^1.1 || ^2.0",
3434
"twig/twig": "^2.9 || ^3.0"
3535
},

src/BecklynAssetsBundle.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,30 @@
33
namespace Becklyn\AssetsBundle;
44

55
use Becklyn\AssetsBundle\DependencyInjection\BecklynAssetsExtension;
6+
use Becklyn\AssetsBundle\File\Type\SpecializedFileType;
7+
use Symfony\Component\DependencyInjection\ContainerBuilder;
68
use Symfony\Component\HttpKernel\Bundle\Bundle;
79

810
class BecklynAssetsBundle extends Bundle
911
{
12+
/**
13+
* @inheritDoc
14+
*/
1015
public function getContainerExtension ()
1116
{
1217
return new BecklynAssetsExtension();
1318
}
19+
20+
21+
/**
22+
* @inheritDoc
23+
*/
24+
public function build (ContainerBuilder $container) : void
25+
{
26+
$container
27+
->registerForAutoconfiguration(SpecializedFileType::class)
28+
->addTag("becklyn_assets.file_type");
29+
}
30+
31+
1432
}

src/File/FileTypeRegistry.php

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
use Becklyn\AssetsBundle\Asset\Asset;
66
use Becklyn\AssetsBundle\File\Type\FileType;
77
use Becklyn\AssetsBundle\File\Type\GenericFile;
8+
use Psr\Container\ContainerInterface;
9+
use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException;
810

911
class FileTypeRegistry
1012
{
@@ -17,18 +19,18 @@ class FileTypeRegistry
1719
/**
1820
* The file types mapped by file extension.
1921
*
20-
* @var array<string,FileType>
22+
* @var ContainerInterface
2123
*/
22-
private $fileTypes = [];
24+
private $specializedFileTypes;
2325

2426

2527
/**
26-
* @param array $specializedFileTypes the mapping of `extension => FileType` of all specialized file types
28+
* @param ContainerInterface $specializedFileTypes the mapping of `extension => FileType` of all specialized file types
2729
*/
28-
public function __construct (GenericFile $genericFileType, array $specializedFileTypes = [])
30+
public function __construct (GenericFile $genericFileType, ContainerInterface $specializedFileTypes)
2931
{
3032
$this->genericFileType = $genericFileType;
31-
$this->fileTypes = $specializedFileTypes;
33+
$this->specializedFileTypes = $specializedFileTypes;
3234
}
3335

3436

@@ -46,7 +48,13 @@ public function getFileType (Asset $asset) : FileType
4648
*/
4749
public function getByFileExtension (string $extension) : FileType
4850
{
49-
return $this->fileTypes[$extension] ?? $this->genericFileType;
51+
try {
52+
return $this->specializedFileTypes->get($extension);
53+
}
54+
catch (ServiceNotFoundException $exception)
55+
{
56+
return $this->genericFileType;
57+
}
5058
}
5159

5260

src/File/Type/CssFile.php

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
use Becklyn\AssetsBundle\File\Type\Css\CssImportRewriter;
88
use Becklyn\HtmlBuilder\Node\HtmlElement;
99

10-
class CssFile extends FileType
10+
class CssFile extends SpecializedFileType
1111
{
1212
use GenericFileHeaderTrait;
1313

@@ -80,4 +80,13 @@ public function shouldBeGzipCompressed () : bool
8080
{
8181
return true;
8282
}
83+
84+
85+
/**
86+
* @inheritDoc
87+
*/
88+
public static function supportsExtension () : string
89+
{
90+
return "css";
91+
}
8392
}

src/File/Type/JavaScriptFile.php

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
use Becklyn\AssetsBundle\Data\AssetEmbed;
77
use Becklyn\HtmlBuilder\Node\HtmlElement;
88

9-
class JavaScriptFile extends FileType
9+
class JavaScriptFile extends SpecializedFileType
1010
{
1111
use GenericFileHeaderTrait;
1212

@@ -51,4 +51,13 @@ public function shouldBeGzipCompressed () : bool
5151
{
5252
return true;
5353
}
54+
55+
56+
/**
57+
* @inheritDoc
58+
*/
59+
public static function supportsExtension () : string
60+
{
61+
return "js";
62+
}
5463
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php declare(strict_types=1);
2+
3+
namespace Becklyn\AssetsBundle\File\Type;
4+
5+
abstract class SpecializedFileType extends FileType
6+
{
7+
/**
8+
* Returns the extension that this file type supports.
9+
*/
10+
abstract public static function supportsExtension () : string;
11+
}

src/File/Type/SvgFile.php

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
use Becklyn\AssetsBundle\Asset\Asset;
66

7-
class SvgFile extends FileType
7+
class SvgFile extends SpecializedFileType
88
{
99
use GenericFileHeaderTrait;
1010

@@ -28,4 +28,13 @@ public function shouldBeGzipCompressed () : bool
2828
{
2929
return true;
3030
}
31+
32+
33+
/**
34+
* @inheritDoc
35+
*/
36+
public static function supportsExtension () : string
37+
{
38+
return "svg";
39+
}
3140
}

src/Resources/config/services.yaml

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,7 @@ services:
1414
public: true
1515

1616
Becklyn\AssetsBundle\File\FileTypeRegistry:
17-
$specializedFileTypes:
18-
css: '@Becklyn\AssetsBundle\File\Type\CssFile'
19-
js: '@Becklyn\AssetsBundle\File\Type\JavaScriptFile'
20-
svg: '@Becklyn\AssetsBundle\File\Type\SvgFile'
17+
$specializedFileTypes: !tagged_locator { tag: becklyn_assets.file_type, default_index_method: supportsExtension }
2118

2219
Becklyn\AssetsBundle\Html\AssetHtmlGenerator:
2320
public: true

tests/File/FileLoaderTest.php

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use Becklyn\AssetsBundle\File\Type\GenericFile;
1010
use Becklyn\AssetsBundle\Namespaces\NamespaceRegistry;
1111
use PHPUnit\Framework\TestCase;
12+
use Symfony\Component\DependencyInjection\ServiceLocator;
1213

1314
class FileLoaderTest extends TestCase
1415
{
@@ -36,7 +37,7 @@ protected function setUp () : void
3637
"bundles" => "{$this->fixtures}/public/bundles",
3738
]);
3839

39-
$fileTypes = new FileTypeRegistry(new GenericFile());
40+
$fileTypes = new FileTypeRegistry(new GenericFile(), new ServiceLocator([]));
4041

4142
$this->loader = new FileLoader($this->namespaceRegistry, $fileTypes);
4243
}
@@ -100,9 +101,9 @@ public function testCustomProcessorCalledInDev () : void
100101
->method("processForDev")
101102
->willReturnArgument(2);
102103

103-
$fileTypes = new FileTypeRegistry(new GenericFile(), [
104-
"css" => $testFileType,
105-
]);
104+
$fileTypes = new FileTypeRegistry(new GenericFile(), new ServiceLocator([
105+
"css" => function () use ($testFileType) { return $testFileType; },
106+
]));
106107

107108
$loader = new FileLoader($this->namespaceRegistry, $fileTypes);
108109
$loader->loadFile(new Asset("bundles", "test/css/app.css"), FileLoader::MODE_DEV);
@@ -123,9 +124,9 @@ public function testCustomProcessorCalledInProd () : void
123124
->method("processForProd")
124125
->willReturnArgument(1);
125126

126-
$fileTypes = new FileTypeRegistry(new GenericFile(), [
127-
"css" => $testFileType,
128-
]);
127+
$fileTypes = new FileTypeRegistry(new GenericFile(), new ServiceLocator([
128+
"css" => function () use ($testFileType) { return $testFileType; },
129+
]));
129130

130131
$loader = new FileLoader($this->namespaceRegistry, $fileTypes);
131132
$loader->loadFile(new Asset("bundles", "test/css/app.css"), FileLoader::MODE_PROD);
@@ -145,9 +146,9 @@ public function testCustomProcessorNotCalledInUntouched () : void
145146
->expects(self::never())
146147
->method("processForProd");
147148

148-
$fileTypes = new FileTypeRegistry(new GenericFile(), [
149-
"css" => $testFileType,
150-
]);
149+
$fileTypes = new FileTypeRegistry(new GenericFile(), new ServiceLocator([
150+
"css" => function () use ($testFileType) { return $testFileType; },
151+
]));
151152

152153
$loader = new FileLoader($this->namespaceRegistry, $fileTypes);
153154
$loader->loadFile(new Asset("bundles", "test/css/app.css"), FileLoader::MODE_UNTOUCHED);
@@ -176,9 +177,9 @@ public function testFallbackType () : void
176177
->method("processForProd")
177178
->willReturnArgument(1);
178179

179-
$fileTypes = new FileTypeRegistry($genericFileType, [
180-
"css" => $testFileType,
181-
]);
180+
$fileTypes = new FileTypeRegistry($genericFileType, new ServiceLocator([
181+
"css" => function () use ($testFileType) { return $testFileType; },
182+
]));
182183

183184
$loader = new FileLoader($this->namespaceRegistry, $fileTypes);
184185
$loader->loadFile(new Asset("bundles", "test/js/test.js"), FileLoader::MODE_PROD);

0 commit comments

Comments
 (0)