首页 > 解决方案 > Mojolicious `under` 是如何工作的?

问题描述

文档

仅当回调返回 true 值时,才会评估所有后续路由。

是什么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

标签: perlmojolicious

解决方案


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

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

表示您的回调没有呈现任何内容。

通常,您的under回调将用于排除一些常见行为,例如检查访问权限(请参阅教程)。
在此示例中,如果需要,回调将重定向到登录页面,或者返回 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


推荐阅读