Skip to content

Commit 5e6c334

Browse files
committed
RestFullResourceController, RestFullApiController Added
1 parent b51b3df commit 5e6c334

File tree

5 files changed

+468
-52
lines changed

5 files changed

+468
-52
lines changed

docs/controller.md

Lines changed: 63 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -79,39 +79,79 @@ If you like to render using Twig you can use the following codes:
7979
For default template system, Creating layout is same task as create a view file. Create a view file into **{APPDIR}/view/_layouts** like other view files. Then You just need to echo the $content variable where you like to display the partial view within the layout.
8080
If you are using the twig template engine, then follow the [twig instruction](./twig.md).
8181

82-
6. RestFullController:
82+
6. RestFullApiController:
8383
----------------------
84-
A base controller for implementing Rest Api. All controller those serve rest api should extend it instead of CIX_Controller or CI_Controller. A sample
84+
A base controller for implementing Restful Api. All controller those serve restful api should extend it instead of CIX_Controller or CI_Controller. A sample
8585
Controller implementing Api may looks like follow:
8686

8787
```php
88+
use \Xiidea\Base\RestFullApiController as BaseController;
8889

89-
class Api extends \Xiidea\Base\RestFullController {
90+
class Api extends BaseController {
9091

91-
public function access_map(){
92-
return array(
93-
'user_get'=>'view',
94-
'user_post'=>'create',
95-
'user_put'=>'edit',
96-
'user_delete'=>'delete',
97-
);
98-
}
92+
public function user_get(){
93+
$this->sendResponse(200, json_encode(array('name'=>'Name of user')));
94+
}
95+
96+
public function user_post(){
97+
$this->sendResponse(200, json_encode(array('success'=>true, 'msg'=>'user created')));
98+
}
99+
100+
public function user_put(){
101+
$this->sendResponse(200, json_encode(array('success'=>true, 'msg'=>'user updated')));
102+
}
103+
104+
public function user_delete(){
105+
$this->sendResponse(200, json_encode(array('success'=>true, 'msg'=>'user deleted')));
106+
}
107+
}
108+
109+
```
99110

100-
public function user_get(){
101-
$this->sendResponse(200, json_encode(array('name'=>'Name of user')));
102-
}
111+
6. RestFullResourceController:
112+
----------------------
113+
A base controller for implementing Restful Api for an resource entity. All controller those serve restful api resource, should extend it instead of CIX_Controller or CI_Controller or RestFullApiController. A sample
114+
Controller implementing Users resource api may looks like follow:
115+
116+
```php
117+
use \Xiidea\Base\RestFullResourceController as BaseController;
103118

104-
public function user_post(){
105-
$this->sendResponse(200, json_encode(array('success'=>true, 'msg'=>'user created')));
106-
}
119+
class Users extends BaseController {
107120

108-
public function user_put(){
109-
$this->sendResponse(200, json_encode(array('success'=>true, 'msg'=>'user updated')));
110-
}
121+
public function index()
122+
{
123+
$this->sendResponse(200, json_encode(array('success'=>true, 'msg'=>'user list page on get request /users')));
124+
}
125+
126+
public function show()
127+
{
128+
$this->sendResponse(200, json_encode(array('success'=>true, 'msg'=>'view single resource on get /users/1')));
129+
}
130+
131+
public function create()
132+
{
133+
$this->sendResponse(200, json_encode(array('success'=>true, 'msg'=>'create on post /users')));
134+
}
135+
136+
public function edit()
137+
{
138+
$this->sendResponse(200, json_encode(array('success'=>true, 'msg'=>'edit form on get /users/1/edit')));
139+
}
140+
141+
public function update()
142+
{
143+
$this->sendResponse(200, json_encode(array('success'=>true, 'msg'=>'update on put /users/1')));
144+
}
145+
146+
public function delete()
147+
{
148+
$this->sendResponse(200, json_encode(array('success'=>true, 'msg'=>'delete on delete request /users/1')));
149+
}
111150

112-
public function user_delete(){
113-
$this->sendResponse(200, json_encode(array('success'=>true, 'msg'=>'user deleted')));
114-
}
151+
public function create_new()
152+
{
153+
$this->sendResponse(200, json_encode(array('success'=>true, 'msg'=>'new form for /users/new')));
115154
}
155+
}
116156

117157
```
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the CIX package.
5+
*
6+
* (c) Roni Saha <[email protected]>
7+
*
8+
* This source file is subject to the MIT license that is bundled
9+
* with this source code in the file LICENSE.
10+
*/
11+
12+
namespace Xiidea\Base;
13+
/**
14+
* CodeIgniter-Extended Application Controller Class For RestFull Request
15+
*
16+
* @package CodeIgniter-Extended
17+
* @subpackage Libraries
18+
* @category Libraries
19+
* @author Roni Saha <[email protected]>
20+
*/
21+
class RestFullApiController extends RestFullBase
22+
{
23+
24+
function __construct()
25+
{
26+
parent::__construct();
27+
$this->_restrictFromRouter(__CLASS__);
28+
$this->_re_route();
29+
}
30+
31+
public function _remap($method, $arguments)
32+
{
33+
try {
34+
call_user_func_array(array($this, $this->router->fetch_method()), $arguments);
35+
}
36+
catch (\Exception $e) {
37+
$this->sendResponse(404);
38+
}
39+
}
40+
41+
private function _re_route()
42+
{
43+
$requestMethod = strtolower($_SERVER['REQUEST_METHOD']);
44+
$controllerMethod = $this->_method . '_' . $requestMethod;
45+
46+
if (!is_callable(array($this, $controllerMethod))) {
47+
$this->sendResponse(404);
48+
}
49+
50+
$this->router->set_method($controllerMethod);
51+
}
52+
}
53+
54+
/* End of file RestFullController.php */
55+
/* Location: ./Xiidea/Base/RestFullApiController.php */

src/libs/Xiidea/Base/RestFullController.php renamed to src/libs/Xiidea/Base/RestFullBase.php

Lines changed: 3 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -11,46 +11,20 @@
1111

1212
namespace Xiidea\Base;
1313
/**
14-
* CodeIgniter-Extended Application Controller Class For RestFull Request
15-
*
16-
* This class object is the super class that every library in
17-
* CodeIgniter-Extended will be assigned to.
14+
* CodeIgniter-Extended Application Controller Base Class For RestFull Request
1815
*
1916
* @package CodeIgniter-Extended
2017
* @subpackage Libraries
2118
* @category Libraries
2219
* @author Roni Saha <[email protected]>
2320
*/
24-
class RestFullController extends Controller
21+
class RestFullBase extends Controller
2522
{
2623

2724
function __construct()
2825
{
2926
parent::__construct();
3027
$this->_restrictFromRouter(__CLASS__);
31-
$this->_re_route();
32-
}
33-
34-
public function _remap($method, $arguments)
35-
{
36-
try {
37-
call_user_func_array(array($this, $this->router->fetch_method()), $arguments);
38-
}
39-
catch (\Exception $e) {
40-
$this->sendResponse(404);
41-
}
42-
}
43-
44-
private function _re_route()
45-
{
46-
$requestMethod = strtolower($_SERVER['REQUEST_METHOD']);
47-
$controllerMethod = $this->_method . '_' . $requestMethod;
48-
49-
if (!is_callable(array($this, $controllerMethod))) {
50-
$this->sendResponse(404);
51-
}
52-
53-
$this->router->set_method($controllerMethod);
5428
}
5529

5630
public function sendResponse($status = 200, $body = null, $content_type = 'application/json')
@@ -87,4 +61,4 @@ public function sendResponse($status = 200, $body = null, $content_type = 'appli
8761
}
8862

8963
/* End of file RestFullController.php */
90-
/* Location: ./Xiidea/Base/RestController.php */
64+
/* Location: ./Xiidea/Base/RestFullBase.php */
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the CIX package.
5+
*
6+
* (c) Roni Saha <[email protected]>
7+
*
8+
* This source file is subject to the MIT license that is bundled
9+
* with this source code in the file LICENSE.
10+
*/
11+
12+
namespace Xiidea\Base;
13+
14+
use Xiidea\Helper\EasyGuide;
15+
/**
16+
* CodeIgniter-Extended Application Controller Class For RestFull Request
17+
*
18+
* @package CodeIgniter-Extended
19+
* @subpackage Libraries
20+
* @category Libraries
21+
* @author Roni Saha <[email protected]>
22+
*/
23+
class RestFullResourceController extends RestFullBase
24+
{
25+
protected $isSingleResource = false;
26+
27+
function __construct()
28+
{
29+
parent::__construct();
30+
$this->_restrictFromRouter(__CLASS__);
31+
EasyGuide::setRestFullActionMap($this->getRestFullDefinition());
32+
$this->_re_route();
33+
}
34+
35+
public function _remap()
36+
{
37+
try {
38+
call_user_func_array(array($this, $this->router->fetch_method()), array_slice($this->uri->rsegments, 2));
39+
}
40+
catch (\Exception $e) {
41+
$this->sendResponse(404);
42+
}
43+
}
44+
45+
protected function getRestFullDefinition()
46+
{
47+
return array();
48+
}
49+
50+
private function _re_route()
51+
{
52+
$routes = $this->createRestFullRoute();
53+
54+
$uri = implode('/', $this->uri->rsegments);
55+
56+
$uri = preg_replace('/index$/', '', $uri);
57+
58+
if (isset($routes[$uri]))
59+
{
60+
return $this->router->_set_request(explode('/', $routes[$uri]));
61+
}
62+
63+
foreach ($routes as $key => $val)
64+
{
65+
// Convert wild-cards to RegEx
66+
$key = str_replace(':any', '.+', str_replace(':num', '[0-9]+', $key));
67+
68+
// Does the RegEx match?
69+
if (preg_match('#^'.$key.'$#', $uri))
70+
{
71+
// Do we have a back-reference?
72+
if (strpos($val, '$') !== FALSE AND strpos($key, '(') !== FALSE)
73+
{
74+
$val = preg_replace('#^'.$key.'$#', $val, $uri);
75+
}
76+
return $this->router->_set_request(explode('/', $val));
77+
}
78+
}
79+
}
80+
81+
private function _parse_routes(){
82+
// Loop through the route array looking for wild-cards
83+
84+
}
85+
86+
private function createRestFullRoute()
87+
{
88+
$class = strtolower(get_class($this));
89+
90+
$resourceFunction = $this->isSingleResource ? 'resource' : 'resources';
91+
92+
EasyGuide::map(function($r) use ($class, $resourceFunction){
93+
$r->$resourceFunction($class);
94+
});
95+
96+
return EasyGuide::draw();
97+
}
98+
}
99+
100+
/* End of file RestFullController.php */
101+
/* Location: ./Xiidea/Base/RestFullResourceController.php */

0 commit comments

Comments
 (0)