[英]CakePHP REST API basic routing
我試圖讓一個簡單的 rest API 在 CakePHP 工作,但由於某種原因,資源路由不起作用。
從一個干凈的應用程序(my_app)和蛋糕文檔中的簡單 rest 示例開始,執行以下操作:
Router::scope('/', function ($routes) {
$routes->setExtensions(['json']);
$routes->resources('Recipes');
});
創建了一個食譜控制器:
<?php
namespace my_app\Controller;
use my_app\Controller\AppController;
class RecipesController extends AppController
{
public function initialize()
{
parent::initialize();
$this->loadComponent('RequestHandler');
}
public function index()
{
echo 'index'; exit;
}
public function view($id)
{
echo "view $id"; exit;
}
public function add()
{
echo 'add'; exit;
}
public function edit($id)
{
echo "edit $id"; exit;
}
public function delete($id)
{
echo "delete $id"; exit;
}
}
curl -X "POST" -H "Accept: application/json" 'https://nvl.crazytje.com/comapi/Recipes'
=> expecting: "add"
=> result: "index"
curl -X "DELETE" -H "Accept: application/json" 'https://nvl.crazytje.com/comapi/Recipes/1'
=> expecting "delete 1"
=> result: "action not found"
curl -X "GET" -H "Accept: application/json" 'https://nvl.crazytje.com/comapi/Recipes/1'
=> expecting: "view 1"
=> result: action not found
curl -X "PUT" -H "Accept: application/json" 'https://nvl.crazytje.com/comapi/Recipes/1'
=> expecting: "edit 1"
=> result: action not found
我缺少哪些步驟才能使其正常工作? 在過去(幾年前)我有這個工作,不知道我做了什么不同
不知道這是否是最好的方法,但似乎適用於我的小應用程序。 創建了一個改變動作的中間件
use Cake\Http\Response;
use Cake\Http\ServerRequest;
class RESTMiddleware {
public function __invoke(ServerRequest $request, Response $response, $next) {
$params = (array)$request->getAttribute('params', []);
if(empty($params['action']) || !method_exists("\Comapi\Controller\InvoiceController", $params['action'])) {
switch(strtolower($request->getMethod())) {
case 'get':
if(empty($params['action']) || $params['action'] == 'index') {
$params['action'] = 'index';
} else {
$params['pass'][] = $params['action'];
$params['action'] = 'view';
}
break;
case 'post':
$params['action'] = 'add';
break;
case 'put':
case 'patch':
$params['pass'][] = $params['action'];
$params['action'] = 'edit';
break;
case 'delete':
$params['pass'][] = $params['action'];
$params['action'] = 'delete';
break;
}
}
$request = $request->withAttribute('params', $params);
$response = $next($request, $response);
return $response;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.