Php Cake-设置路由以支持版本化的API控制器?

Php Cake-设置路由以支持版本化的API控制器?,php,cakephp,url-routing,cakephp-3.x,api-versioning,Php,Cakephp,Url Routing,Cakephp 3.x,Api Versioning,我希望能够同时支持api中的多个版本化端点,例如: /api/v1.1/counties/get /api/v1.2/counties/get 但是在尝试实现这个路由时,我有点困惑,因为我一直得到一个 错误:找不到控制器类 尝试1: Router::scope('/api', function ($routes) { $routes->setExtensions(['json']); $routes->fallbacks('DashedRoute');

我希望能够同时支持api中的多个版本化端点,例如:

/api/v1.1/counties/get
/api/v1.2/counties/get
但是在尝试实现这个路由时,我有点困惑,因为我一直得到一个

错误:找不到控制器类

尝试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
{
}

如果您有任何见解,请不要在名称空间文件夹结构中使用类似点的字符,因为这是无效的PHP

您正在寻找的是使用前缀路由和路径选项,以便可以连接在名称空间中有效的前缀,并为路由提供自定义路径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路由检查连接的路由:

CountiesController类将在

src/Controller/Api/V11/CountiesController.php 命名空间为:

App\Controller\Api\V11 另见


不能在名称空间文件夹结构中使用类似点的字符,因为这是无效的PHP

您正在寻找的是使用前缀路由和路径选项,以便可以连接在名称空间中有效的前缀,并为路由提供自定义路径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路由检查连接的路由:

CountiesController类将在

src/Controller/Api/V11/CountiesController.php 命名空间为:

App\Controller\Api\V11 另见


我确实尝试了V1.1和V1_1的组合,因为我知道会有一些有趣/无效的事情发生。我会试试你的建议-谢谢!我确实尝试了V1.1和V1_1的组合,因为我知道会有一些有趣/无效的事情发生。我会试试你的建议-谢谢!如果您需要对URL上的API进行主版本和次版本控制,那么您对API的更改太多了。最好考虑一下如何在将来进行更改,以提高向后兼容性。另一种可能是您只是使用后端的软件版本作为API版本。API不应该经常变化,简单的v1、v2等就足够了。如果您需要对URL上的API进行主版本和次版本控制,那么您对API的更改太多了。最好考虑一下如何在将来进行更改,以提高向后兼容性。另一种可能是您只是使用后端的软件版本作为API版本。API不应该经常变异,一个简单的v1、v2等就足够了。