如何在 Mojolicious 中查找给定路径的路径名称?

Posted

技术标签:

【中文标题】如何在 Mojolicious 中查找给定路径的路径名称?【英文标题】:How to find route name for given path in Mojolicious? 【发布时间】:2017-05-18 22:22:44 【问题描述】:

当我解析 html 响应正文时,我想为正文中找到的所有链接查找路由名称。我使用下一个代码 sn-p:

    my $url =  Mojo::URL->new( $got );
    my $method =  uc( $url->query->clone->param( '_method' ) || 'GET' );
    my $c =  $t->app->build_controller;
    my $m =  Mojolicious::Routes::Match->new( root => $t->app->routes );

    $m->find( $c =>  method => $method,  path => $url->path  );

然后$m->endpoint->name 给我路由的名称。

但是有没有更简单的方法可以通过给定路径查找路线名称?

我正在寻找类似的东西:$app->routes->find( '/api/v/users/146/link/7QRgs' ) 应该返回 user_hash_check,因为我有下一条路线:

$guest->get( '/users/:id/link/:hash', 'user_hash_check' )->to( 'user#hash_check' );

【问题讨论】:

出于好奇,你什么时候用这个?您正在解析自己的应用程序网站吗? @simbabque:是的,我愿意。实际上我在测试中使用它 @ikegami:我认为对于这种常见情况,子应该已经存在于 Mojolicious 中 对我来说听起来不是很常见! @ikegami:Mojolicious 在收到请求时会创建可作为$c->match 访问的路由。所以某处它已经将path 字符串转换为route 对象。还有note about reversibility。要将路线渲染到路径中,我可以:$r->lookup( 'route_name' )->render( foo => 'bar' )。但是我没有找到简单的方法来获取路径,除了那五行有问题的代码,我应该放入 sub 【参考方案1】:

我发现只有一个地方可以按路径找到路线。那是Mojolicious::Routes::Match 并且没有其他方法可以做到这一点

在我看来,一件丑陋的事情是要求提供Mojolicious::Controller 对象。但是控制器只需要做出决定:调度或不调度因为它有额外的信息来做出这个决定:这是要检查的数据conditions

我认为问题是因为这里有两件事:

    请求 路径

而find 应该只返回与给定参数匹配的所有路由:路径和方法。 like selectors does 数组结果可能会被缓存(现在没有缓存有条件的路由)

那么 dispatcher 应该检查conditions 与每条路由,而不是matcher。这里每个条件都可以在右控制器而不是默认的上下文中调用。这将修复this issue。大多数情况下,路由都有自己的控制器类没有?

在修复此行为之前问题中的示例是查找路线的最佳方式

【讨论】:

以上是关于如何在 Mojolicious 中查找给定路径的路径名称?的主要内容,如果未能解决你的问题,请参考以下文章

如何在给定路径下查找具有与递归精确模式匹配的位置的目录名称列表[重复]

如何从 mysql DB 中搜索与 mojolicious perl 中选定的下拉列表相关的内容

Linux命令查找文件或目录 find

POJ3177 分离的路径

从计划任务运行 perl Plackup 脚本

在有向图中查找具有给定长度的路径,允许循环和负长度