-
Notifications
You must be signed in to change notification settings - Fork 15
/
ImageStrategy.php
124 lines (112 loc) · 3.26 KB
/
ImageStrategy.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
119
120
121
122
123
124
<?php
namespace HtImgModule\View\Strategy;
use HtImgModule\View\Model\ImageModel;
use Zend\EventManager\EventManagerInterface;
use Zend\EventManager\ListenerAggregateInterface;
use Zend\View\ViewEvent;
use Imagine\Image\ImagineInterface;
use Imagine\Image\ImageInterface;
use HtImgModule\Exception;
use HtImgModule\View\Renderer\ImageRenderer;
class ImageStrategy implements ListenerAggregateInterface
{
/**
* @var \Zend\Stdlib\CallbackHandler[]
*/
protected $listeners = [];
/**
* @var ImagineInterface
*/
protected $imagine;
/**
* Constructor
*
* @param ImagineInterface $imagine
*/
public function __construct(ImagineInterface $imagine)
{
$this->imagine = $imagine;
}
/**
* {@inheritDoc}
*/
public function attach(EventManagerInterface $events, $priority = 1)
{
$this->listeners[] = $events->attach(ViewEvent::EVENT_RENDERER, [$this, 'selectRenderer'], $priority);
$this->listeners[] = $events->attach(ViewEvent::EVENT_RESPONSE, [$this, 'injectResponse'], $priority);
}
/**
* {@inheritDoc}
*/
public function detach(EventManagerInterface $events)
{
foreach ($this->listeners as $index => $listener) {
if ($events->detach($listener)) {
unset($this->listeners[$index]);
}
}
}
/**
* Sets ImageRenderer as Renderer when ImageModel is used
*
* @param ViewEvent $e
* @return ImageRenderer|null
* @throws Exception\RuntimeException
*/
public function selectRenderer(ViewEvent $e)
{
$model = $e->getModel();
if ($model instanceof ImageModel) {
if (!$model->getImage() instanceof ImageInterface) {
if (!$model->getImagePath()) {
throw new Exception\RuntimeException(
'You must provide Imagine\Image\ImageInterface or path of image'
);
}
$model->setImage($this->imagine->open($model->getImagePath()));
}
return new ImageRenderer();
}
}
/**
* Sets the response based on image returned by the renderer
*
* @param ViewEvent $e
* @return void
*/
public function injectResponse(ViewEvent $e)
{
$model = $e->getModel();
if ($model instanceof ImageModel) {
$result = $e->getResult();
$response = $e->getResponse();
$response->setContent($result);
$response->getHeaders()->addHeaderLine('Content-type', $this->getMimeType($model->getFormat()));
}
}
/**
* Internal
*
* Get the mime type based on format.
*
* @param string $format
*
* @return string mime-type
*
* @throws RuntimeException
*/
protected function getMimeType($format)
{
static $mimeTypes = array(
'jpeg' => 'image/jpeg',
'jpg' => 'image/jpeg',
'pjpeg' => 'image/jpeg',
'gif' => 'image/gif',
'png' => 'image/png',
'wbmp' => 'image/vnd.wap.wbmp',
'xbm' => 'image/xbm',
);
$format = strtolower($format);
return $mimeTypes[$format];
}
}