Cake — Настройка маршрутизации для поддержки контроллеров API с поддержкой версий?

Я хочу иметь возможность поддерживать несколько версионных конечных точек из моего API одновременно, таких как:

/api/v1.1/counties/get
/api/v1.2/counties/get

Но пытаясь реализовать маршрутизацию для этого, я немного озадачен тем, как Cake хочет этого, так как я продолжаю получать

Ошибка: класс контроллеров не может быть найден.

Попытка 1:

Router::scope('/api', function ($routes) {

$routes->setExtensions(['json']);
$routes->fallbacks('DashedRoute');

$versions = [
1.1
];

foreach ($versions as $version) {
$routes->scope('/' . $version, function($routes) {

$routes->resources('Counties', [
'controller' => 'Counties',
'prefix' => 'api',
'map' => [
'get' => [
'action' => 'get',
]
]
]);

}
}

});

Попытка 2:

Router::scope('/api', function($routes) {

$routes->scope('/v1.1', function($routes) {
$routes->resources('Counties', [
'controller' => 'Counties',
'map' => [
'get' => [
'action' => 'get'
]
]
]);
});

$routes->connect(
'/v1.1/counties/get',
[
'controller' => 'Counties',
'action' => 'get',
]
);
});

Структура каталогов, которую я сейчас использую (которая до сих пор открыта для обсуждения):

src / Controller / Api / V1.1, который будет использовать базовые контроллеры из src / Controller / Api и расширять их методами-заглушками для переопределения при необходимости. Большая часть моего «жира» в моделях.

и src / Controller / Api / V1.1 / CountiesController.php имеет:

namespace App\Controller\Api\V1.1;

class CountiesController extends AppController
{
}

Буду признателен за любые идеи

0

Решение

Вы не можете использовать символы типа точек в структуре пространства имен (папок), так как это недопустимый PHP.

То, что вы ищете, использует префиксную маршрутизацию и path опция, так что вы можете подключить префиксы, которые действительны в пространствах имен, и предоставить собственный путь (сегмент URL) для маршрута, что-то вроде:

Router::prefix('api', function (RouteBuilder $routes) {
// ...

$routes->prefix('v11', ['path' => '/v1.1'], function (RouteBuilder $routes) {
$routes->resources('Counties', [
'map' => [
'get' => [
'action' => 'get'
]
]
]);
});
});

Что бы подключить следующие маршруты (вы можете проверить подключенные маршруты в оболочке с помощью bin/cake routes):

+---------------------+-----------------------+--------------------------------------------------------------------------------------------------+
| Route name          | URI template          | Defaults                                                                                         |
+---------------------+-----------------------+--------------------------------------------------------------------------------------------------+
| v11:counties:index  | api/v1.1/counties     | {"controller":"Counties","action":"index","_method":"GET","prefix":"v11","plugin":null}          |
| v11:counties:add    | api/v1.1/counties     | {"controller":"Counties","action":"add","_method":"POST","prefix":"v11","plugin":null}           |
| v11:counties:view   | api/v1.1/counties/:id | {"controller":"Counties","action":"view","_method":"GET","prefix":"v11","plugin":null}           |
| v11:counties:edit   | api/v1.1/counties/:id | {"controller":"Counties","action":"edit","_method":["PUT","PATCH"],"prefix":"v11","plugin":null} |
| v11:counties:delete | api/v1.1/counties/:id | {"controller":"Counties","action":"delete","_method":"DELETE","prefix":"v11","plugin":null}      |
| v11:counties:get    | api/v1.1/counties/get | {"controller":"Counties","action":"get","_method":"GET","prefix":"v11","plugin":null}            |
+---------------------+-----------------------+--------------------------------------------------------------------------------------------------+

CountiesController класс будет ожидать в

src/Controller/Api/V11/CountiesController.php

с пространством имен:

App\Controller\Api\V11

Смотрите также

3

Другие решения

Других решений пока нет …