Perl mojolicous'under'的效果如何?

Perl mojolicous'under'的效果如何?,perl,mojolicious,Perl,Mojolicious,发件人: 仅当回调返回真值时,才会计算以下所有路由 下面的是什么意思 仅在此路径下的路径组 在代码后面声明的路线,在此之后的下 我也不明白下一个场景会发生什么: perl -Mojo -E ' app->routes->under("/", sub{ warn "R1"; return undef })->get("/r1" => {text => "r1" }); app-&

发件人:

仅当回调返回真值时,才会计算以下所有路由

下面的
是什么意思

  • 仅在此路径下的路径组
  • 在代码后面声明的路线,在此之后的
  • 我也不明白下一个场景会发生什么:

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

    [timestamp][6389][debug][Ere90x2U]未呈现任何内容,预期响应延迟

    指示回调返回时没有呈现任何内容

    通常,您在
    下的
    回调将用于排除一些常见行为,如检查访问权限(请参阅)。
    
    在本例中,回调会在必要时重定向到登录页面,或返回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
    将被呈现。

    我不太理解您的问题。第一个示例仅(正确地)警告两个路由,但不返回小写内容。这是因为回调需要返回一个真值。去掉
    return undef
    ,改为执行
    1
    ,以查看警告和文本。@simbabque:第一个示例是命令永远不会返回(这是一个问题)。我返回
    undef
    ,因为它们仅限于身份验证用户。比如@simbabque:所以两条路线都是受限的,没有匹配的。我应该得到404或一些错误吗?你可能应该重定向到一个登录页面。或呈现一些消息,-无论如何,返回undef不会呈现任何内容。这很有帮助。但对于单线应用程序,不会创建日志,也不会显示调试消息是的,没错。@EugenKonkov单线应用程序的用例是什么?当然,如果你想要更复杂的行为,比如分解出那样的行为,你会投入比一行长得多的资金。@simbabque:它们是用来学习
    下的
    是如何工作的