Глобальная переменная mason2 в 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>

1 ответ

Просто прочитайте Poet:: Import.

Простой пример:

# generate app My
poet new my
cd my

добавить класс 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, Итак, вы просто расширяете Poet::Importдобавив в него еще один "атрибут" (вашу "переменную").

В приведенном выше примере

  • добавил атрибут 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>

$mytemp с использованием use Poet qw($mytemp); импортируется из вашего My/Import.pm, (это только для чтения, по определению - (is => 'ro',...).

Все в Poet/Mason является Moose:), так что (конечно) вы можете импортировать rw переменная с любым isa... так далее.

Просто помните, что вышеприведенное является истинной глобальной и постоянной переменной. Например, его содержание сохраняется между запросами. В большинстве случаев вы не хотите использовать такие переменные, только в нескольких особых случаях, например, вы хотите инициализировать некоторый дескриптор базы данных $dbh (что должно быть доступно при запуске приложения) и тому подобное.

Во-вторых, здесь также $m->notes метод, но не злоупотребляйте им. Из документов:

Метод notes() предоставляет место для хранения данных приложения между компонентами - по сути, хеш, который сохраняется в течение всего запроса.

Рассмотрите возможность хранения данных такого типа в атрибуте чтения-записи компонента страницы.

В большинстве случаев достаточно использовать простые атрибуты компонента, например, см., Например, в сгенерированном приложении по умолчанию использование $.title (например, $self->title).

Или вы можете просто передать переменные компонентам в качестве аргументов,

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

и так далее...

Опять же, каждый component является:

  • просто верблюд
  • с рогами
  • используя некоторые инструменты кладки
  • в поэтической среде
  • на вершине холма ПСГИ

:)

Другие вопросы по тегам