我期待收到uri的喜欢
/user/*/account/*
sub user :Path('/user') :PathPart('') :ActionClass('REST' ) {}
然后
sub user_GET :PathPart('user') Chained('/') CaptureArgs(1) { #do stuff }
对于帐户我也是类似地定义它们.
sub account :Path('/account') :PathPart('') :ActionClass('REST') {} sub account_GET :PathPart('account') Chained('user_GET') Args(1) { #do stuff }
所以,问题是当我将account_GET中的Chained设置为服务器的’user_GET’时
debug显示路径已设置:
[debug] Loaded Chained actions: .-----------------------------+--------------------------------------. | Path Spec | Private | +-----------------------------+--------------------------------------+ | /user/*/account/* | /mcp/user_GET (1) | | | => /mcp/account_GET | '-----------------------------+--------------------------------------'
当我将account_GET中的Chained设置为’user’时,服务器调试显示:
[debug] Unattached Chained actions: [debug] Unattached Chained actions: .-------------------------------------+--------------------------------------. | Private | Missing parent | +-------------------------------------+--------------------------------------+ | /mcp/account_GET | /mcp/user | '-------------------------------------+--------------------------------------'
问题是,显然后者没有建立而前者是
返回它没有找到.
所以问题是如果我正在调用/ user / 12345 / account / 23456我该如何获得该路径
当看起来很明显的路径时,链接(‘用户’)没有正确设置
被设置和不太明显的路径,链接(‘user_GET’),根本不起作用?
解决方法
就个人而言,我会在用户控制器中使用以下内容:
package MyApp::Controller::User; ... # root of the chain sub object: Chained PathPart('user') CaptureArgs(1) { ... }
上面的对象操作会将用户对象加载到存储中.现在我将用户控制器链接到上面,如下所示:
package MyApp::Controller::User::Account; ... # chains to the action loading the user object and dispatches RESTy sub account: Chained('/user/object') ActionClass('REST') Args(1) { ... } # handle individual request methods sub account_GET { ... } sub account_POST { ... }
此处,帐户操作为account_ *方法提供了执行实际操作的公共数据.
将方法特定操作作为链的一部分(例如让用户对帐户操作的POST请求作出反应)从设计角度来看似乎有点违反直觉.这可能有用,但我从未尝试过.
以上示例当然是简化的.我通常在每个控制器中设置基本操作,设置命名空间和公共父操作,控制器中的所有其他操作将链接该操作.然后我将有一个像上面这样的对象来加载单个资源,以及一个root用于控制器的根动作.由于您可以构建任何类型的树结构,因此它非常灵活.因此,最佳解决方案通常取决于您的约束条件.