Completed
Pull Request — master (#29)
by Paulo Rodrigues
06:00
created

createManifestVersionStrategy()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 25
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 15
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 25
ccs 15
cts 15
cp 1
rs 8.8571
c 0
b 0
f 0
cc 1
eloc 16
nc 1
nop 2
crap 1
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', array(
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, array('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
     * @return Definition
71
     */
72 19
    private function createPackage($name, array $config)
73
    {
74 19
        $prefixes = $config['prefix'];
75 19
        $isUrl = Util::containsUrl($prefixes);
76
77 19
        $packageDefinition = $isUrl
78 4
            ? new DefinitionDecorator($this->namespaceService('asset.package.url'))
79 19
            : new DefinitionDecorator($this->namespaceService('asset.package.path'))
80
        ;
81
82 19
        if ($config['manifest']['enabled']) {
83 4
            $versionStrategy = $this->createManifestVersionStrategy($name, $config['manifest']);
84
        } else {
85 17
            $versionStrategy = new Reference($this->namespaceService('version_strategy.empty'));
86
        }
87
88
        return $packageDefinition
89 19
            ->addArgument($isUrl ? $prefixes : $prefixes[0])
90 19
            ->addArgument($versionStrategy)
91 19
            ->setPublic(false);
92
    }
93
94
    /**
95
     * @param string $name
96
     * @return string
97
     */
98 19
    private function getPackageId($name)
99
    {
100 19
        return $this->namespaceService("_package.$name");
101
    }
102
103
    /**
104
     * @param string $packageName
105
     * @param array $config
106
     * @return Reference
107
     */
108 4
    private function createManifestVersionStrategy($packageName, $config)
109
    {
110 4
        $loader = new DefinitionDecorator($this->namespaceService('manifest.loader.'.$config['format']));
111
        $loader
112 4
            ->addArgument($config['path'])
113 4
            ->addArgument($config['root_key'])
114
        ;
115
116 4
        $loaderId = $this->namespaceService("_package.$packageName.manifest_loader");
117 4
        $this->container->setDefinition($loaderId, $loader);
118
119 4
        $cachedLoader = new DefinitionDecorator($this->namespaceService('manifest.loader.cached'));
120 4
        $cachedLoader->addArgument(new Reference($loaderId));
121
122 4
        $cachedLoaderId = $this->namespaceService("_package.$packageName.manifest_loader_cached");
123 4
        $this->container->setDefinition($cachedLoaderId, $cachedLoader);
124
125 4
        $versionStrategy = new DefinitionDecorator($this->namespaceService('version_strategy.manifest'));
126 4
        $versionStrategy->addArgument(new Reference($cachedLoaderId));
127
128 4
        $versionStrategyId = $this->namespaceService("_package.$packageName.version_strategy");
129 4
        $this->container->setDefinition($versionStrategyId, $versionStrategy);
130
131 4
        return new Reference($versionStrategyId);
132
    }
133
134
    /**
135
     * @param string $id
136
     * @return string
137
     */
138 19
    private function namespaceService($id)
139
    {
140 19
        return $this->alias.'.'.$id;
141
    }
142
}
143