Angularjs 如何在cakephp中使用前缀将post rest请求连接到add controller操作

Angularjs 如何在cakephp中使用前缀将post rest请求连接到add controller操作,angularjs,rest,cakephp,cakephp-2.0,ionic-framework,Angularjs,Rest,Cakephp,Cakephp 2.0,Ionic Framework,我编写了一个客户机/服务器应用程序 服务器端由CakePHP 2.4.7提供支持 在移动设备上使用angularjs和cordova在客户端运行 我使用了几个cakephp路由前缀,它们的“admin”和“mobile”。 (我使用$resource和$httpInterceptor angularjs工厂设置REST请求。) 我想通过json数据发布调用/website/mobile/posts/add.json 因此,我使用POST ajax查询调用/website/mobile/pos

我编写了一个客户机/服务器应用程序

  • 服务器端由CakePHP 2.4.7提供支持
  • 在移动设备上使用angularjs和cordova在客户端运行
我使用了几个cakephp路由前缀,它们的“admin”和“mobile”。 (我使用$resource和$httpInterceptor angularjs工厂设置REST请求。)

我想通过json数据发布调用
/website/mobile/posts/add.json

因此,我使用POST ajax查询调用
/website/mobile/posts.json

问题就在这里:被调用的控制器操作是'index',而不是'add'

在我的PostsController上,我添加了以下内容:

echo $this->request->params['action'] . "\n";
echo ($this->request->isPost())? "post" . "\n" : "not post";
die;
答案总是:

mobile_index
post
因此ajax请求看起来是正确的,但是cakephp没有将其映射到add操作,而是索引一。 不过我的配置似乎也不错;下面是my routes.php的一个片段

Router::mapResources(array('users','posts'));
Router::parseExtensions('json');
有什么想法吗?

前缀路由不适用于现成的REST路由 REST路由通过自动为传递到
路由器::mapResources()
的控制器创建路由来工作。前缀路由与此基本相同,它创建默认路由,包括
routing.prefixes
中定义的前缀

但是,这两种功能互不了解,它们都创建单独的路由,因此
Router::mapResources()
将连接到不带前缀的URL(此方法的
prefix
选项不使用实际的前缀路由,它只会将该选项的值添加到要连接的URL的开头!),因此,您对
/mobile/..
的请求实际上不使用REST路由,而只使用前缀路由

手动定义带前缀的REST路由 对于这个问题没有简单的解决方法,比如使用一个选项或其他什么,相反,您必须手动定义REST路由,以便包含前缀选项,尽管这很简单

见和

示例路线可能如下所示:

Router::connect(
    '/mobile/users',
    array(
        'prefix' => 'mobile',
        'mobile' => true,
        'controller' => 'users',
        'action' => 'add',
        '[method]' => 'POST'
    )
);
mapResources(array(
    'books' => array(
        'prefix' => 'mobile'
    )
));
这将把POST请求连接到
/mobile/users
UsersController::mobile\u add()
。同样,对于所有其他方法,如
GET
PUT
,无论是否传递
id
,都必须这样做

请注意,当手动连接时,您可以放弃
路由.前缀
选项,当然也可以放弃对
路由器::mapResources()
的调用

自动绘图 手动定义所有这些路由有点让人筋疲力尽,您最好将其自动化

下面是一个如何执行此操作的示例,它有点类似于
路由器::mapResources()
,但它接受一个实际使用前缀路由的
前缀
选项:

function mapResources(array $controllers) {
    $resourceMap = Router::resourceMap();

    foreach($controllers as $controller => $options) {
        if(!is_array($options)) {
            $controller = $options;
            $options = array();
        }
        $options += array(
            'prefix' => null,
            'plugin' => null,
            'id' => Router::ID . '|' . Router::UUID
        );

        foreach($resourceMap as $params) {
            $url = '';
            if($options['prefix']) {
                $url .= '/' . $options['prefix'];
            }
            if($options['plugin']) {
                $url .= '/' . $options['plugin'];
            }
            $url .= '/' . $controller;
            if($params['id']) {
                $url .= '/:id';
            }

            Router::connect(
                $url,
                array(
                    'prefix' => $options['prefix'],
                    $options['prefix'] => !!$options['prefix'],
                    'plugin' => $options['plugin'],
                    'controller' => $controller,
                    'action' => $params['action'],
                    '[method]' => $params['method']
                ),
                array(
                    'id' => $options['id'],
                    'pass' => array('id')
                )
            );
        }
    }
}
你可以这样称呼它:

Router::connect(
    '/mobile/users',
    array(
        'prefix' => 'mobile',
        'mobile' => true,
        'controller' => 'users',
        'action' => 'add',
        '[method]' => 'POST'
    )
);
mapResources(array(
    'books' => array(
        'prefix' => 'mobile'
    )
));

它将使用
mobile
前缀映射
书籍
控制器的所有剩余路由。

您使用的是实际(
Configure::write(
),即您希望最终调用前缀控制器操作,如
mobile\u add()
,还是您的“前缀”只是漂亮的URL?是的,我真的使用前缀路由