Zend Framework 2 有提供一個 AbstractRestfulController 用來實作 REST API。不過按照慣例,Zend Freamework 的說明文件都只是簡單帶過而已,真正的用法與規則還得去閱讀程式碼。
使用方法,就只要繼承 AbstractRestfulController 即可:
1 2 |
class ResourceController extends AbstractRestfulController { } |
在 Router 那邊,記得不要設置 action:
1 2 3 4 5 6 7 8 9 10 |
'rest_resource' => array( 'type' => 'segment', 'may_terminate' => true, 'options' => array( 'route' => '/resource[/][:id]', 'defaults' => array( 'controller' => 'ModuleNamespace\Controller\Resource', ), ), ), |
之後,就會自動對應到 Controller 的 Method:
- GET => getList()
- GET + id => get($id)
- POST => create($data)
- PUT => replaceList($data)
- PUT + id => update($id, $data)
- DELETE => deleteList()
- DELETE + id => delete($id)
- HEAD => head($id)
- OPTIONS => options()
- PATCH => patchList($data)
- PATCH + id => patch($id, $data)
因此,一個支援 GET 與 POST 的 Controller 大概長這樣:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
class ResourceController extends AbstractRestfulController { public function get($id) { //....... return $response; } public function getList() { //....... return $response; } public function create($data) { //....... return $response; } } |
其它沒有實作的部份,AbstractRestfulController 會幫你回應 405 Method Not Allowed 。
另外,identifier 的名稱,預設是用 “id”,為了可讀性,你也可以自訂 identifier,下面我們改用 “name” 作為 identifier:
1 2 3 4 |
class ResourceController extends AbstractRestfulController { protected $identifierName = 'name'; //............. } |
相對應的 Router 也需要把 id 改為 name:
1 2 3 4 5 6 7 8 9 10 |
'rest_resource' => array( 'type' => 'segment', 'may_terminate' => true, 'options' => array( 'route' => '/resource[/][:name]', 'defaults' => array( 'controller' => 'ModuleNamespace\Controller\Resource', ), ), ), |
AbstractRestfulController 的用法大致上就這樣。