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在客户端运行
/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?是的,我真的使用前缀路由