POET 中的全局变量 mason2

Global Variable mason2 in POET

我是 Mason2/POET 的新手,我一直在使用本指南 http://search.cpan.org/~jswartz/Poet/lib/Poet/Manual/Tutorial.pod 创建我的第一个网站。

现在我想创建一个新的全局变量(例如:$User),但是我不知道或者我应该采取什么方向才能这样做,因为文档没有解释它。我找到的大多数文档都是关于 Apache 或 mod_perl...

我正在寻找的示例:

<%augment wrap>
 <html>
  html code goes here
 </html>
</%augment>
<%init>
my $User;
Mason::Interp::allow_globals => [qw($User)];
</%init>

刚刚阅读Poet::Import

简单示例:

# generate app My
poet new my
cd my

添加一个class My::Import,例如

vi lib/My/Import.pm

并加入其中

package My::Import;
use Poet::Moose;
extends 'Poet::Import';

use Types::Path::Tiny qw(Path);

# create some variable
has 'mytemp' => (is => 'ro', isa => Path, coerce => 1, default => '/tmp');

method provide_var_mytemp ($caller) { #your WANTED variable name - add after the "provide_var_"
    return $self->mytemp;
}
1; #happy perl

例如Poet::Import 已经导入了变量 $conf$env(还有实用程序标签 :web。因此,您只需通过添加另一个 [=94] 来扩展 Poet::Import =] (你的 "variable") 进去。

在上面的例子中

  • 添加了属性mytemp
  • 并希望将全局变量称为 $mytemp

现在,您可以在您的组件中使用它。编辑您的 comps/index.mc.

进顶加

<%class>
use Poet qw($mytemp);  #your global variable (is a Path::Tiny object to /tmp)
</%class>

并添加以下内容:

<h1>My files in the /tmp</h1>
<pre>
% for my $file ($mytemp->children) {
        <% $file %>
% }
</pre>

使用 use Poet qw($mytemp);$mytemp 是从您的 My/Import.pm 导入的。 (根据其定义,它是只读的 - (is => 'ro',...)。

Poet/Mason 中的所有内容都是 Moose :),因此(当然)您可以使用任何 isa... 等导入 rw 变量

请记住,以上是真正的全局持久变量。例如。它的内容在请求之间被保留。在大多数情况下,您不想使用此类变量,只有在少数特殊情况下,例如,您想要初始化一些数据库句柄 $dbh(在应用程序运行时应该可用的)等等。

其次,这里还有$m->notes这个方法,但是不要过度使用。来自 docs:

The notes() method provides a place to store application data between components - essentially, a hash which persists for the duration of the request.

Consider storing this kind of data in a read-write attribute of the page component.

大多数情况下,使用简单的组件属性就足够了,例如例如,在生成的默认应用程序中查看 $.title 的用法(例如 $self->title)。

或者您可以将变量作为参数传递给组件,

<& somecomp.mc, arg1 => 'some', arg2 => 'other' &>

等等...

同样,每个 component 是:

  • 只是一头骆驼
  • 有鹿角
  • 使用一些砌体工具
  • 在诗意的环境中
  • 在 PSGI 山顶

:)