ConcatResolver   A
last analyzed

Complexity

Total Complexity 14

Size/Duplication

Total Lines 170
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 5

Importance

Changes 0
Metric Value
wmc 14
lcom 1
cbo 5
dl 0
loc 170
rs 10
c 0
b 0
f 0

11 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A setMimeResolver() 0 4 1
A getMimeResolver() 0 4 1
A setConcats() 0 4 1
A setAggregateResolver() 0 4 1
A getAggregateResolver() 0 4 1
A getConcats() 0 4 1
B resolve() 0 37 4
A setAssetFilterManager() 0 4 1
A getAssetFilterManager() 0 4 1
A collect() 0 4 1
1
<?php
2
3
namespace AssetManager\Core\Resolver;
4
5
use Assetic\Asset\AssetInterface;
6
use AssetManager\Core\Asset\AggregateAsset;
7
use AssetManager\Core\Exception;
8
use AssetManager\Core\Service\AssetFilterManager;
9
use AssetManager\Core\Service\AssetFilterManagerAwareInterface;
10
use AssetManager\Core\Service\MimeResolver;
11
use Traversable;
12
use Zend\Stdlib\ArrayUtils;
13
14
/**
15
 * This resolver allows the resolving of concatenated files.
16
 * Concatted files are added as an StringAsset and filters get applied to concatenated string.
17
 */
18
class ConcatResolver implements
19
    ResolverInterface,
20
    AggregateResolverAwareInterface,
21
    AssetFilterManagerAwareInterface,
22
    MimeResolverAwareInterface
23
{
24
    /**
25
     * @var null|ResolverInterface
26
     */
27
    protected $aggregateResolver;
28
29
    /**
30
     * @var null|AssetFilterManager The filterManager service.
31
     */
32
    protected $filterManager;
33
34
    /**
35
     * @var array the concats
36
     */
37
    protected $concats = array();
38
39
    /**
40
     * @var MimeResolver The mime resolver.
41
     */
42
    protected $mimeResolver;
43
44
    /**
45
     * Constructor
46
     *
47
     * Instantiate and optionally populate concats.
48
     *
49
     * @param array|Traversable $concats
50
     */
51
    public function __construct($concats = array())
52
    {
53
        $this->setConcats($concats);
54
    }
55
56
    /**
57
     * Set the mime resolver
58
     *
59
     * @param MimeResolver $resolver
60
     */
61
    public function setMimeResolver(MimeResolver $resolver)
62
    {
63
        $this->mimeResolver = $resolver;
64
    }
65
66
    /**
67
     * Get the mime resolver
68
     *
69
     * @return MimeResolver
70
     */
71
    public function getMimeResolver()
72
    {
73
        return $this->mimeResolver;
74
    }
75
76
    /**
77
     * Set (overwrite) concats
78
     *
79
     * Concats should be arrays or Traversable objects with name => path pairs
80
     *
81
     * @param  array|Traversable                  $concats
82
     * @throws Exception\InvalidArgumentException
83
     */
84
    public function setConcats($concats)
85
    {
86
        $this->concats = ArrayUtils::iteratorToArray($concats);
87
    }
88
89
    /**
90
     * Set the aggregate resolver.
91
     *
92
     * @param ResolverInterface $aggregateResolver
93
     */
94
    public function setAggregateResolver(ResolverInterface $aggregateResolver)
95
    {
96
        $this->aggregateResolver = $aggregateResolver;
97
    }
98
99
    /**
100
     * Get the aggregate resolver.
101
     *
102
     * @return ResolverInterface
103
     */
104
    public function getAggregateResolver()
105
    {
106
        return $this->aggregateResolver;
107
    }
108
109
    /**
110
     * Retrieve the concats
111
     *
112
     * @return array
113
     */
114
    public function getConcats()
115
    {
116
        return $this->concats;
117
    }
118
119
    /**
120
     * {@inheritDoc}
121
     */
122
    public function resolve($name)
123
    {
124
        if (!isset($this->concats[$name])) {
125
            return null;
126
        }
127
128
        $resolvedAssets = array();
129
130
        foreach ((array) $this->concats[$name] as $assetName) {
131
            $resolvedAsset = $this->getAggregateResolver()->resolve((string) $assetName);
132
133
            if (!$resolvedAsset instanceof AssetInterface) {
134
                throw new Exception\RuntimeException(
135
                    sprintf(
136
                        'Asset "%s" from collection "%s" can\'t be resolved '
137
                        .'to an Asset implementing Assetic\Asset\AssetInterface.',
138
                        $assetName,
139
                        $name
140
                    )
141
                );
142
            }
143
144
            $resolvedAsset->mimetype = $this->getMimeResolver()->getMimeType(
0 ignored issues
show
Bug introduced by
Accessing mimetype on the interface Assetic\Asset\AssetInterface suggest that you code against a concrete implementation. How about adding an instanceof check?

If you access a property on an interface, you most likely code against a concrete implementation of the interface.

Available Fixes

  1. Adding an additional type check:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeInterface $object) {
        if ($object instanceof SomeClass) {
            $a = $object->a;
        }
    }
    
  2. Changing the type hint:

    interface SomeInterface { }
    class SomeClass implements SomeInterface {
        public $a;
    }
    
    function someFunction(SomeClass $object) {
        $a = $object->a;
    }
    
Loading history...
145
                $resolvedAsset->getSourceRoot() . $resolvedAsset->getSourcePath()
146
            );
147
148
            $this->getAssetFilterManager()->setFilters($assetName, $resolvedAsset);
149
150
            $resolvedAssets[] = $resolvedAsset;
151
        }
152
        $aggregateAsset = new AggregateAsset($resolvedAssets);
153
        $this->getAssetFilterManager()->setFilters($name, $aggregateAsset);
154
        $aggregateAsset->setTargetPath($name);
155
        $aggregateAsset->mimetype = $this->getMimeResolver()->getMimeType($name);
156
157
        return $aggregateAsset;
158
    }
159
160
    /**
161
     * Set the AssetFilterManager.
162
     *
163
     * @param AssetFilterManager $filterManager
164
     */
165
    public function setAssetFilterManager(AssetFilterManager $filterManager)
166
    {
167
        $this->filterManager = $filterManager;
168
    }
169
170
    /**
171
     * Get the AssetFilterManager
172
     *
173
     * @return AssetFilterManager
174
     */
175
    public function getAssetFilterManager()
176
    {
177
        return $this->filterManager;
178
    }
179
180
    /**
181
     * {@inheritDoc}
182
     */
183
    public function collect()
184
    {
185
        return array_keys($this->concats);
186
    }
187
}
188