Completed
Pull Request — master (#29)
by Paulo Rodrigues
05:36
created

AssetExtensionLoader::load()   B

Complexity

Conditions 3
Paths 4

Size

Total Lines 28
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 28
rs 8.8571
c 0
b 0
f 0
cc 3
eloc 17
nc 4
nop 2
1
<?php
2
3
namespace Rj\FrontendBundle\DependencyInjection;
4
5
use Rj\FrontendBundle\Util\Util;
6
use Symfony\Component\Config\Loader\LoaderInterface;
7
use Symfony\Component\DependencyInjection\ContainerBuilder;
8
use Symfony\Component\DependencyInjection\Definition;
9
use Symfony\Component\DependencyInjection\DefinitionDecorator;
10
use Symfony\Component\DependencyInjection\Reference;
11
12
class AssetExtensionLoader
13
{
14
    /**
15
     * @var string
16
     */
17
    private $alias;
18
19
    /**
20
     * @var ContainerBuilder
21
     */
22
    private $container;
23
24
    /**
25
     * @param string           $alias
26
     * @param ContainerBuilder $container
27
     */
28
    public function __construct($alias, ContainerBuilder $container)
29
    {
30
        $this->alias = $alias;
31
        $this->container = $container;
32
    }
33
34
    /**
35
     * @param array           $config
36
     * @param LoaderInterface $loader
37
     */
38
    public function load(array $config, LoaderInterface $loader)
39
    {
40
        $loader->load('asset.yml');
41
42
        if ($config['override_default_package']) {
43
            $loader->load('fallback.yml');
44
45
            $defaultPackage = $this->createPackage('default', [
46
                'prefix' => $config['prefix'],
47
                'manifest' => $config['manifest'],
48
            ]);
49
50
            $defaultPackageId = $this->getPackageId('default');
51
            $this->container->setDefinition($defaultPackageId, $defaultPackage);
52
53
            $this->container->getDefinition($this->namespaceService('package.fallback'))
54
                ->addArgument($config['fallback_patterns'])
55
                ->addArgument(new Reference($defaultPackageId));
56
        }
57
58
        foreach ($config['packages'] as $name => $packageConfig) {
59
            $packageTag = $this->namespaceService('package.asset');
60
            $package = $this->createPackage($name, $packageConfig)
61
                ->addTag($packageTag, ['alias' => $name]);
62
63
            $this->container->setDefinition($this->getPackageId($name), $package);
64
        }
65
    }
66
67
    /**
68
     * @param string $name
69
     * @param array  $config
70
     *
71
     * @return Definition
72
     */
73
    private function createPackage($name, array $config)
74
    {
75
        $prefixes = $config['prefix'];
76
        $isUrl = Util::containsUrl($prefixes);
77
78
        $packageDefinition = $isUrl
79
            ? new DefinitionDecorator($this->namespaceService('asset.package.url'))
80
            : new DefinitionDecorator($this->namespaceService('asset.package.path'))
81
        ;
82
83
        if ($config['manifest']['enabled']) {
84
            $versionStrategy = $this->createManifestVersionStrategy($name, $config['manifest']);
85
        } else {
86
            $versionStrategy = new Reference($this->namespaceService('version_strategy.empty'));
87
        }
88
89
        return $packageDefinition
90
            ->addArgument($isUrl ? $prefixes : $prefixes[0])
91
            ->addArgument($versionStrategy)
92
            ->setPublic(false);
93
    }
94
95
    /**
96
     * @param string $name
97
     *
98
     * @return string
99
     */
100
    private function getPackageId($name)
101
    {
102
        return $this->namespaceService("_package.$name");
103
    }
104
105
    /**
106
     * @param string $packageName
107
     * @param array  $config
108
     *
109
     * @return Reference
110
     */
111
    private function createManifestVersionStrategy($packageName, $config)
112
    {
113
        $loader = new DefinitionDecorator($this->namespaceService('manifest.loader.'.$config['format']));
114
        $loader
115
            ->addArgument($config['path'])
116
            ->addArgument($config['root_key'])
117
        ;
118
119
        $loaderId = $this->namespaceService("_package.$packageName.manifest_loader");
120
        $this->container->setDefinition($loaderId, $loader);
121
122
        $cachedLoader = new DefinitionDecorator($this->namespaceService('manifest.loader.cached'));
123
        $cachedLoader->addArgument(new Reference($loaderId));
124
125
        $cachedLoaderId = $this->namespaceService("_package.$packageName.manifest_loader_cached");
126
        $this->container->setDefinition($cachedLoaderId, $cachedLoader);
127
128
        $versionStrategy = new DefinitionDecorator($this->namespaceService('version_strategy.manifest'));
129
        $versionStrategy->addArgument(new Reference($cachedLoaderId));
130
131
        $versionStrategyId = $this->namespaceService("_package.$packageName.version_strategy");
132
        $this->container->setDefinition($versionStrategyId, $versionStrategy);
133
134
        return new Reference($versionStrategyId);
135
    }
136
137
    /**
138
     * @param string $id
139
     *
140
     * @return string
141
     */
142
    private function namespaceService($id)
143
    {
144
        return $this->alias.'.'.$id;
145
    }
146
}
147