Completed
Push — master ( e37ae2...a63d79 )
by Paulo Rodrigues
06:49
created

AssetExtensionLoader::createPackage()   A

Complexity

Conditions 4
Paths 4

Size

Total Lines 21
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 12
CRAP Score 4

Importance

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