WebApp::Template 条件行为和变量的使用

WebApp::Template condition behaviour and use of variables

使用提供的模板语言,我始终可以访问 $_ 或哈希引用进行迭代,这很好。

# In routes
get -> 'somestuff' {
  my $stuff = %{ arr => [ {stuff => 'stuff1' , nbr => 1 }, {stuff => 'stuff2', nbr => 2 } ] };
  template 'somestuff.crotpl', $stuff;
}
# In somestuff.crotpl
<?$_.elems>
<$_> <br>
<@arr> <.stuff> = <.nbr> <br> </@>  
</?>

但是测试不存在的 key/value <?{.not-here}> ...</?> 会抛出异常,这是正常行为吗?

我认为变量,如文档中未说明的那样,仅在从与路由上下文无关的模板子例程调用它们时才可用(如测试文件所示:https://github.com/croservices/cro-webapp/blob/master/t/test-data/cond-var.crotmp)。同样测试不存在的变量也会抛出异常。

<.foo> 取消引用的文档如下:

If the current topic does the Associative role, then this form will prefer to take the value under the name hash key, falling back to looking for a method name if there is no such key.

因此,如果没有这样的键,那么它确实会回退到方法调用,并且(在 Raku 中通常是这种情况)如果没有这样的方法就会出错。所以是的,这是预期的行为。

还有一些明确的形式,它们总是会进行哈希访问(软失败)或方法分派(如果没有这样的方法,则会出错。再次引用文档的相关部分:

  • <.elems()> will always be a method call, even if used on an Associative (so can be used to overcome the key fallback)
  • <.<elems>> will always be a hash index

这些在整个模板语言中一致适用,因此可以使用 <$var<foo>><?{ $var<foo> }>(假设文档可能会更清楚地说明这一点)。

模板顶层范围内的唯一变量是 $_,它被初始化为调用 template 时传递的值。迭代、子例程和宏都可能引入变量。如文档中所述:

It is a template compilation time error to refer to a variable that does not exist.

这意味着它们遵循与 Raku 中的词法变量相同的规则。该错误是在模板编译时产生的,这意味着可以编写一个编译所有模板的单元测试,以确保至少不存在这种错误。

一般来说,模板语言遵循 Raku 语义,唯一的显着差异是 <.foo> 作用于 Associative 更像 .<foo>:exists ?? .<foo> !! .foo 的东西。