为什么Mojolicious筑巢我的路线?

问题描述:

我Mojolicious的应用程序有一些自定义的认证机制,这是我在路由条件实现所谓auth_permission为什么Mojolicious筑巢我的路线?

$app->add_condition(auth_permission => sub { 
    return is_user_allowed(...) ? 1 : 0; 
}); 

所以我的路线是这个样子:

my $r = $app->routes; 

$r->get('/prefs') 
    # no permission necessary here 
    ->to(...); 

$r->get('/objects') 
    ->over(auth_permission => 'view objects') 
    ->to(...); 

$r->get('/objects/delete/:id') 
    ->over(auth_permission => 'delete objects') 
    ->to(...); 

to()条款正确处理: GET /objects给我的对象列表,并GET /objects/delete/42删除对象42.

问题是,权限view objects检查两个请求,即使第二路径应检查许可delete objects

原因似乎是/objects/delete/42低于/objects的路径。同样的问题并不与路线/prefs,其不具有与其他路线的公共基地发生。

我目前的解决办法是把规则/objects低于的一个/objects/delete/:id,但这是一个)unelegant和为b)去当另一家开发商编辑该文件打破。我能否明确禁用在这种情况下看到的嵌套行为?

+2

这看起来非常简单的行为给我。而你所谓的解决方法是Mojolicious如何匹配路线的逻辑结果。海事组织你回答你的问题。 – 2012-07-20 09:28:40

Mojolicious文档似乎表明您应该建立处理较短的对象的扩展路线。见Nested Routes节的文档中。

这意味着你有一个$对象路线,和$ objects_delete路线从它派生。消除排序问题(除了首先声明较短的路线)。