【问题标题】:Multiple prefixes in CakePHP for API routingCakePHP 中用于 API 路由的多个前缀
【发布时间】:2016-02-24 06:33:56
【问题描述】:

事实证明,这比应有的难度要大得多。我想做什么:

Router::connect('/:api/:version/:controller/:action/*',
    array(),
    array(
        'api' => 'api',
        'version' => '2.0|2.1'
    )
);

并让它映射到控制器动作。例如,有这个:

http://example.com/api/2.0/users/get/1

...在用户控制器中映射到这个...

public function api_2_0_get()...

我错过了什么?

【问题讨论】:

    标签: cakephp routing


    【解决方案1】:

    您错过了这样一个事实,即这既不受支持,也没有实际使用前缀路由。您要么必须连接每个前缀的路由,例如

    Router::connect('/api/2.0/:controller/:action/*',
        array(
            'prefix' => 'api_2_0',
            'api_2_0' => true
        )
    );
    
    Router::connect('/api/2.1/:controller/:action/*',
        array(
            'prefix' => 'api_2_1',
            'api_2_1' => true
        )
    );
    

    另请参阅Cookbook > Development > Routing > Prefix Routing

    或使用自定义路由类,从多个路由元素构建动作名称,类似于

    app/Routing/Route/VersionedApiRoute.php

    App::uses('CakeRoute', 'Routing/Route');
    
    class VersionedApiRoute extends CakeRoute
    {
        public function parse($url)
        {
            $route = parent::parse($url);
            if (!$route) {
                return false;
            }
    
            $route['action'] =
                'api_' . str_replace('.', '_', $route['version']) . '_' . $route['action'];
    
            return $route;
        }
    }
    

    app/Config/routes.php

    App::uses('VersionedApiRoute', 'Routing/Route');
    
    Router::connect('/api/:version/:controller/:action/*',
        array(),
        array(
            'routeClass' => 'VersionedApiRoute',
            'version' => '2\.0|2\.1' // this is a regex, so don't forget to escape the dots
        )
    );
    

    另请参阅Cookbook > Development > Routing > Custom Route Classes

    【讨论】:

      猜你喜欢
      • 2011-03-22
      • 2017-05-12
      • 2011-06-09
      • 2013-10-09
      • 2014-12-17
      • 1970-01-01
      • 1970-01-01
      • 2014-02-19
      • 2012-07-12
      相关资源
      最近更新 更多