CakePHP REST API базовая маршрутизация - PullRequest
0 голосов
/ 29 октября 2019

Я пытаюсь заставить работать простой API отдыха в CakePHP, но по какой-то причине маршрутизация ресурсов не работает.

Начиная с чистого приложения (my_app) и простого примера отдыха вДокументация по тортам:

  1. Добавлен набор расширений и ресурсов внизу маршрутов. php
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

Какие шаги мне не хватает, чтобы заставить это работать? В прошлом (несколько лет назад) у меня была такая работа, понятия не имею, что я делал по-другому

1 Ответ

0 голосов
/ 30 октября 2019

Не знаю, является ли это лучшим способом сделать это, но, похоже, работает для моего небольшого приложения. Создано промежуточное ПО, которое меняет действие

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;
    }
}
...