1
|
|
|
<?php |
2
|
|
|
/** |
3
|
|
|
* A processor for RESTful calls |
4
|
|
|
* |
5
|
|
|
* @package application/processors |
6
|
|
|
* @author marius orcsik <[email protected]> |
7
|
|
|
* @date 2013.10.04 |
8
|
|
|
*/ |
9
|
|
|
namespace vsc\rest\application\processors; |
10
|
|
|
|
11
|
|
|
use vsc\application\processors\ProcessorA; |
12
|
|
|
use vsc\infrastructure\vsc; |
13
|
|
|
use vsc\presentation\requests\ContentType; |
14
|
|
|
use vsc\presentation\requests\HttpRequestA; |
15
|
|
|
use vsc\presentation\requests\HttpRequestTypes; |
16
|
|
|
use vsc\presentation\requests\RawHttpRequest; |
17
|
|
|
use vsc\presentation\responses\ExceptionResponseError; |
18
|
|
|
use vsc\presentation\responses\HttpResponseType; |
19
|
|
|
|
20
|
|
|
abstract class RESTProcessorA extends ProcessorA { |
21
|
|
|
protected $validRequestMethods = array( ); |
22
|
|
|
|
23
|
|
|
public function getValidRequestMethods() { |
24
|
|
|
return $this->validRequestMethods; |
25
|
|
|
} |
26
|
|
|
|
27
|
|
|
protected $validContentTypes = array('*/*'); |
28
|
|
|
|
29
|
1 |
|
public function getValidContentTypes() { |
30
|
1 |
|
return $this->validContentTypes; |
31
|
|
|
} |
32
|
|
|
|
33
|
2 |
|
public function validRequestMethod($sRequestMethod) { |
34
|
2 |
|
return (in_array($sRequestMethod, $this->getValidRequestMethods())); |
35
|
|
|
} |
36
|
|
|
|
37
|
28 |
|
public function validContentType($sContentType) { |
38
|
28 |
|
return ContentType::isAccepted($sContentType, $this->getValidContentTypes()); |
39
|
|
|
} |
40
|
|
|
|
41
|
|
|
abstract public function handleGet(HttpRequestA $oRequest); |
|
|
|
|
42
|
|
|
abstract public function handleHead(HttpRequestA $oRequest); |
|
|
|
|
43
|
|
|
abstract public function handlePost(HttpRequestA $oRequest); |
|
|
|
|
44
|
|
|
abstract public function handlePut(RawHttpRequest $oRequest); |
|
|
|
|
45
|
|
|
abstract public function handleDelete(RawHttpRequest $oRequest); |
|
|
|
|
46
|
|
|
|
47
|
|
|
/** |
48
|
|
|
* @param HttpRequestA $oRequest |
49
|
|
|
* @return \vsc\domain\models\ModelA |
50
|
|
|
* @throws \vsc\presentation\responses\ExceptionResponseError |
51
|
|
|
*/ |
52
|
6 |
|
public function handleRequest(HttpRequestA $oRequest) { |
53
|
6 |
|
if (!$oRequest->isGet() && !RawHttpRequest::isValid($oRequest)) { |
54
|
|
|
$oRequest = new RawHttpRequest(); |
55
|
|
|
vsc::getEnv()->setHttpRequest($oRequest); |
56
|
|
|
} |
57
|
|
|
|
58
|
6 |
|
switch ($oRequest->getHttpMethod()) { |
59
|
6 |
|
case HttpRequestTypes::GET: |
60
|
1 |
|
$oModel = $this->handleGet($oRequest); |
61
|
1 |
|
break; |
62
|
5 |
|
case HttpRequestTypes::HEAD: |
63
|
1 |
|
$oModel = $this->handleHead($oRequest); |
64
|
1 |
|
break; |
65
|
4 |
|
case HttpRequestTypes::POST: |
66
|
1 |
|
$oModel = $this->handlePost($oRequest); |
67
|
1 |
|
break; |
68
|
3 |
|
case HttpRequestTypes::PUT: |
69
|
1 |
|
$oModel = $this->handlePut($oRequest); |
|
|
|
|
70
|
1 |
|
break; |
71
|
2 |
|
case HttpRequestTypes::DELETE: |
72
|
1 |
|
$oModel = $this->handleDelete($oRequest); |
|
|
|
|
73
|
1 |
|
break; |
74
|
|
|
default: |
75
|
1 |
|
throw new ExceptionResponseError('Method [' . $oRequest->getHttpMethod() . '] is unavailable.', HttpResponseType::METHOD_NOT_ALLOWED); |
76
|
|
|
} |
77
|
5 |
|
return $oModel; |
78
|
|
|
} |
79
|
|
|
} |
80
|
|
|
|
For interface and abstract methods, it is impossible to infer the return type from the immediate code. In these cases, it is generally advisible to explicitly annotate these methods with a
@return
doc comment to communicate to implementors of these methods what they are expected to return.