/
FilterManager.php
118 lines (101 loc) · 2.91 KB
/
FilterManager.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
<?php
namespace Liip\ImagineBundle\Imagine\Filter;
use Imagine\Image\ImagineInterface;
use Liip\ImagineBundle\Binary\BinaryInterface;
use Liip\ImagineBundle\Imagine\Filter\Loader\LoaderInterface;
use Liip\ImagineBundle\Model\Binary;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
class FilterManager
{
/**
* @var FilterConfiguration
*/
protected $filterConfig;
/**
* @var ImagineInterface
*/
protected $imagine;
/**
* @var LoaderInterface[]
*/
protected $loaders = array();
/**
* @param FilterConfiguration $filterConfig
* @param ImagineInterface $imagine
*/
public function __construct(FilterConfiguration $filterConfig, ImagineInterface $imagine)
{
$this->filterConfig = $filterConfig;
$this->imagine = $imagine;
}
/**
* Adds a loader to handle the given filter.
*
* @param string $filter
* @param LoaderInterface $loader
*
* @return void
*/
public function addLoader($filter, LoaderInterface $loader)
{
$this->loaders[$filter] = $loader;
}
/**
* @return FilterConfiguration
*/
public function getFilterConfiguration()
{
return $this->filterConfig;
}
/**
* @param BinaryInterface $binary
* @param array $config
*
* @throws \InvalidArgumentException
*
* @return Binary
*/
public function apply(BinaryInterface $binary, array $config)
{
$config = array_replace(
array(
'filters' => array(),
'quality' => 100
),
$config
);
$image = $this->imagine->load($binary->getContent());
foreach ($config['filters'] as $eachFilter => $eachOptions) {
if (!isset($this->loaders[$eachFilter])) {
throw new \InvalidArgumentException(sprintf(
'Could not find filter loader for "%s" filter type', $eachFilter
));
}
$image = $this->loaders[$eachFilter]->load($image, $eachOptions);
}
$filteredContent = $image->get($binary->getFormat(), array(
'quality' => $config['quality']
));
return new Binary($filteredContent, $binary->getMimeType(), $binary->getFormat());
}
/**
* Apply the provided filter set on the given binary.
*
* @param BinaryInterface $binary
* @param string $filter
* @param array $runtimeConfig
*
* @throws \InvalidArgumentException
*
* @return BinaryInterface
*/
public function applyFilter(BinaryInterface $binary, $filter, array $runtimeConfig = array())
{
$config = array_replace_recursive(
$this->getFilterConfiguration()->get($filter),
$runtimeConfig
);
return $this->apply($binary, $config);
}
}