@@ -50,104 +50,90 @@ class REST_Controller_Plugin_RestHandler extends Zend_Controller_Plugin_Abstract
50
50
);
51
51
52
52
public function __construct (Zend_Controller_Front $ frontController )
53
- {
54
- $ this ->dispatcher = $ frontController ->getDispatcher ();
55
- }
53
+ {
54
+ $ this ->dispatcher = $ frontController ->getDispatcher ();
55
+ }
56
56
57
57
public function dispatchLoopStartup (Zend_Controller_Request_Abstract $ request )
58
- {
59
- // only handle Restful WebApi URI
60
- if (strpos ($ request ->getPathInfo (), '/rest/ ' ) !== FALSE )
61
- {
62
- // send the HTTP Vary header
63
- $ this ->_response ->setHeader ('Vary ' , 'Accept ' );
58
+ {
59
+ // only handle RESTful API URI
60
+ if (strpos ($ request ->getPathInfo (), '/rest/ ' ) !== false ) {
61
+ // send the HTTP Vary header
62
+ $ this ->_response ->setHeader ('Vary ' , 'Accept ' );
64
63
65
- // Cross-Origin Resource Sharing (CORS)
66
- // TODO: probably should be an environment setting?
67
- $ this ->_response ->setHeader ('Access-Control-Max-Age ' , '86400 ' );
68
- $ this ->_response ->setHeader ('Access-Control-Allow-Origin ' , '* ' );
69
- $ this ->_response ->setHeader ('Access-Control-Allow-Credentials ' , 'true ' );
70
- $ this ->_response ->setHeader ('Access-Control-Allow-Headers ' , 'Authorization, X-Authorization, Origin, Accept, Content-Type, X-Requested-With, X-HTTP-Method-Override ' );
64
+ // Cross-Origin Resource Sharing (CORS)
65
+ // TODO: probably should be an environment setting?
66
+ $ this ->_response ->setHeader ('Access-Control-Max-Age ' , '86400 ' );
67
+ $ this ->_response ->setHeader ('Access-Control-Allow-Origin ' , '* ' );
68
+ $ this ->_response ->setHeader ('Access-Control-Allow-Credentials ' , 'true ' );
69
+ $ this ->_response ->setHeader ('Access-Control-Allow-Headers ' , 'Authorization, X-Authorization, Origin, Accept, Content-Type, X-Requested-With, X-HTTP-Method-Override ' );
71
70
72
- // process module apis
73
- $ this ->handlePathInfo ($ request );
71
+ // process module APIs
72
+ $ this ->handlePathInfo ($ request );
74
73
75
- $ class = $ this ->getReflectionClass ($ request );
74
+ $ class = $ this ->getReflectionClass ($ request );
76
75
77
- if ($ this ->isRestClass ($ class ))
78
- {
79
- // set config settings from application.ini
80
- $ this ->setConfig ();
76
+ if ($ this ->isRestClass ($ class )) {
77
+ // set config settings from application.ini
78
+ $ this ->setConfig ();
81
79
82
- // set response format
83
- $ this ->setResponseFormat ($ request );
80
+ // set response format
81
+ $ this ->setResponseFormat ($ request );
84
82
85
- // process requested action
86
- $ this ->handleActions ($ request );
83
+ // process requested action
84
+ $ this ->handleActions ($ request );
87
85
88
- // process request body
89
- $ this ->handleRequestBody ($ request );
90
- }
86
+ // process request body
87
+ $ this ->handleRequestBody ($ request );
88
+ }
91
89
}
92
- }
90
+ }
93
91
94
92
/**
95
93
* Parse PathInfo in the orginal request and then alter the original request
96
- * based on the valid Midas Restful URI format:
94
+ * based on the valid RESTful API URI format:
97
95
* /rest[/{moduleName}]/{controllerName}[/{methodName}][/{Id}]
98
96
* note: [] means optinal parts.
99
97
*/
100
98
private function handlePathInfo (Zend_Controller_Request_Abstract $ request )
101
- {
102
- $ tokens = preg_split ('@/@ ' , $ request ->getPathInfo (), NULL , PREG_SPLIT_NO_EMPTY );
103
- array_shift ($ tokens ); // remove 'rest' prefix
104
- if (!empty ($ tokens ))
105
- {
106
- if (in_array ($ tokens [0 ], Zend_Registry::get ('modulesHaveApi ' )))
107
- {
108
- $ apiModuleName = 'api ' . array_shift ($ tokens );
109
- $ controllerName = array_shift ($ tokens );
110
- $ request ->setParam ('module ' , $ apiModuleName );
111
- $ request ->setParam ('controller ' , $ controllerName );
112
- $ request ->setModuleName ($ apiModuleName );
113
- $ request ->setControllerName ($ controllerName );
114
- // remove redundant parameter generated by Zend routing
115
- $ request ->setParam ($ controllerName , NULL );
116
- }
117
- else
118
- {
119
- array_shift ($ tokens ); // remove controllerName
120
- }
121
- // handle method
122
- if (!empty ($ tokens ) && !is_numeric ($ tokens [0 ]))
123
- {
124
- $ methodName = array_shift ($ tokens );
125
- $ request ->setParam ('method ' , $ methodName );
126
- // remove redundant parameter generated by Zend routing
127
- $ request ->setParam ($ methodName , NULL );
128
- $ request ->setParam ('id ' , NULL );
129
- }
130
- // forward to index action if id is not provided
131
- $ action = $ request ->getActionName ();
132
- if (empty ($ tokens ) && ($ action == "get " || $ action == "index " ))
133
- {
134
- $ request ->setActionName ("index " );
135
- }
136
- else if (empty ($ tokens ) && ($ action == "post " || $ action == "put " ))
137
- {
138
- $ request ->setActionName ("post " );
139
- }
140
- else if (!empty ($ tokens ) && is_numeric ($ tokens [0 ]))
141
- {
142
- $ request ->setParam ('id ' , array_shift ($ tokens ));
143
- }
144
- else
145
- {
146
- $ this ->_response ->setHttpResponseCode (400 ); //400 Bad Request
147
- throw new Exception ('The Webapi ' . $ request ->getPathInfo () . ' is not supported. ' , 400 );
148
- }
99
+ {
100
+ $ tokens = preg_split ('@/@ ' , $ request ->getPathInfo (), null , PREG_SPLIT_NO_EMPTY );
101
+ array_shift ($ tokens ); // remove 'rest' prefix
102
+ if (!empty ($ tokens )) {
103
+ if (in_array ($ tokens [0 ], Zend_Registry::get ('modulesHaveApi ' ))) {
104
+ $ apiModuleName = 'api ' . array_shift ($ tokens );
105
+ $ controllerName = array_shift ($ tokens );
106
+ $ request ->setParam ('module ' , $ apiModuleName );
107
+ $ request ->setParam ('controller ' , $ controllerName );
108
+ $ request ->setModuleName ($ apiModuleName );
109
+ $ request ->setControllerName ($ controllerName );
110
+ // remove redundant parameter generated by Zend routing
111
+ $ request ->setParam ($ controllerName , null );
112
+ } else {
113
+ array_shift ($ tokens ); // remove controllerName
114
+ }
115
+ // handle method
116
+ if (!empty ($ tokens ) && !is_numeric ($ tokens [0 ])) {
117
+ $ methodName = array_shift ($ tokens );
118
+ $ request ->setParam ('method ' , $ methodName );
119
+ // remove redundant parameter generated by Zend routing
120
+ $ request ->setParam ($ methodName , null );
121
+ $ request ->setParam ('id ' , null );
122
+ }
123
+ // forward to index action if id is not provided
124
+ $ action = $ request ->getActionName ();
125
+ if (empty ($ tokens ) && ($ action == 'get ' || $ action == 'index ' )) {
126
+ $ request ->setActionName ('index ' );
127
+ } else if (empty ($ tokens ) && ($ action == 'post ' || $ action == 'put ' )) {
128
+ $ request ->setActionName ('post ' );
129
+ } else if (!empty ($ tokens ) && is_numeric ($ tokens [0 ])) {
130
+ $ request ->setParam ('id ' , array_shift ($ tokens ));
131
+ } else {
132
+ $ this ->_response ->setHttpResponseCode (400 ); // 400 Bad Request
133
+ throw new Exception ('The web API ' . $ request ->getPathInfo () . ' is not supported. ' , 400 );
134
+ }
149
135
}
150
- }
136
+ }
151
137
152
138
private function setConfig ()
153
139
{
@@ -176,7 +162,7 @@ private function setResponseFormat(Zend_Controller_Request_Abstract $request)
176
162
} else {
177
163
$ bestMimeType = $ this ->negotiateContentType ($ request );
178
164
179
- // if there's no matching MimeType, assign default json
165
+ // if there's no matching MimeType, assign default JSON
180
166
if (!$ bestMimeType || $ bestMimeType == '*/* ' ) {
181
167
$ bestMimeType = 'application/json ' ;
182
168
}
@@ -211,7 +197,7 @@ private function handleActions(Zend_Controller_Request_Abstract $request)
211
197
212
198
if ($ name == '__CALL ' and $ method ->class != 'Zend_Controller_Action ' ) {
213
199
$ actions [] = $ request ->getMethod ();
214
- } elseif (substr ($ name , -6 ) == 'ACTION ' and $ name != 'INDEXACTION ' and $ name != ' CALLCOREACTION ' ) {
200
+ } elseif (substr ($ name , -6 ) == 'ACTION ' and $ name != 'INDEXACTION ' ) {
215
201
$ actions [] = str_replace ('ACTION ' , null , $ name );
216
202
}
217
203
}
@@ -361,6 +347,9 @@ private function getReflectionClass(Zend_Controller_Request_Abstract $request)
361
347
if ($ this ->reflectionClass === null ) {
362
348
// get the dispatcher to load the controller class
363
349
$ controller = $ this ->dispatcher ->getControllerClass ($ request );
350
+ // if no controller present escape silently...
351
+ if ($ controller === false ) return false ;
352
+ // ... load controller class
364
353
$ className = $ this ->dispatcher ->loadClass ($ controller );
365
354
366
355
// extract the actions through reflection
0 commit comments