Глобальная переменная 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
является:
- просто верблюд
- с рогами
- используя некоторые инструменты кладки
- в поэтической среде
- на вершине холма ПСГИ
:)