|
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
@returndoc comment to communicate to implementors of these methods what they are expected to return.