【问题标题】:How Mojolicious `under` works?Mojolicious `under` 是如何工作的?
【发布时间】:2021-05-12 05:26:45
【问题描述】:

来自documentation

只有在回调返回真值时才会评估所有后续路由。

following 是什么意思?

  1. 在这条路线下的一组路线
  2. 在代码后面声明的路由under

我也不明白下一个场景会发生什么:

perl -Mojo -E '
  app->routes->under("/", sub{ warn "R1"; return undef })->get("/r1" => {text => "r1" }); 
  app->routes->under("/", sub{ warn "R2"; return undef })->get("/r2" => {text => "r2" }); 
  app->start;
' 
get /r2

这里没有匹配,所以我应该得到404,就像在下一个应用程序中一样:

perl -Mojo -E 'app->start;' get /r2

【问题讨论】:

  • 我不太明白你的问题。您的第一个示例仅对两条路线发出警告(正确),但不返回小写内容。那是因为回调需要返回一个真值。摆脱 return undef 并执行 1 以同时查看警告和文本。
  • @simbabque:起初示例命令永远不会返回(这是一个问题)。我返回undef,因为它们仅限于身份验证用户。喜欢at an example
  • @simbabque:所以两条路线都受到限制,没有任何匹配。我应该得到 404 还是一些错误?
  • 你应该重定向到登录页面。
  • 或者渲染一些消息,-无论如何返回 undef 不会渲染任何东西。

标签: perl mojolicious


【解决方案1】:

你的假设这里没有匹配是不正确的。你有/r2 的路线。与该路由关联的回调形成一个链,其中每个回调可能会通过返回 true 来呈现响应或将责任传递给链中的下一个回调。
如果您从启用了日志记录的应用程序中运行该代码(默认为日志文件 log/development.log),您将看到

[timestamp] [6389] [debug] [Ere90x2U] Nothing has been rendered, expecting delayed response

表明你的回调没有渲染任何东西就返回了。

通常,您的under 回调将用于排除一些常见行为,例如检查访问权限(请参阅tutorial)。
在此示例中,回调在必要时重定向到登录页面或返回 true 以将控制权传递给链中的下一个回调:

  my $logged_in = $r->under(sub ($c) {
    return 1 if $c->session('user');
    $c->redirect_to('index');
    return undef;
  });
  $logged_in->get('/protected');

其实这里/protected的回调是隐式的,会渲染对应的模板protected.html.ep

【讨论】:

  • 这很有帮助。但是对于单行应用程序,不会创建日志并且不会显示调试消息
  • 是的,没错。
  • @EugenKonkov 单行应用程序的用例是什么?当然,如果你想要更复杂的行为,比如分解出这样的行为,你需要投资的不仅仅是一条很长的单行。
  • @simbabque:他们是为了学习 under 的工作原理
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-06
  • 2013-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-03
相关资源
最近更新 更多