2015-02-02 16 views
6

Jestem nowy w Mason2/POET i korzystam z tego przewodnika http://search.cpan.org/~jswartz/Poet/lib/Poet/Manual/Tutorial.pod, aby stworzyć moją pierwszą stronę.Global Variable mason2 in POET

Chciałbym teraz utworzyć nową zmienną globalną (przykład: $ User), ale nie mam pojęcia ani kierunku, w którym powinienem to zrobić, ponieważ dokument ten nie wyjaśnia tego. Większość dokumentów znalazłem były o Apache lub mod_perla ...

Przykład czego szukam:

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

Zazwyczaj nie trzeba żadnej zmiennej globalnej, ale jeśli chcesz trochę Sprawdzić 'Poeta :: Import' i metoda "provide_var_varname". – jm666

+1

@ jm666 Poet :: Import wygląda obiecująco, czy możesz nieco bardziej rozwinąć swój komentarz? dlaczego zazwyczaj nie potrzebujesz żadnej zmiennej globalnej i co zrobić, jeśli chcesz mimo wszystko użyć? Właśnie zacząłem nagrodę za to pytanie ... tnx – fthiella

+1

@fthiella brakowało twojej nagrody, ale w każdym razie dodałem bardziej szczegółową odpowiedź - nadzieja pomaga. – jm666

Odpowiedz

3

Wystarczy przeczytać Poet::Import.

prosty przykład

# generate app My 
poet new my 
cd my 

dodać klasy My::Import np

vi lib/My/Import.pm 

i dodać do niego

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 

np z Poet::Import już importowanie zmiennych $conf i $env (a także tag narzędzie :web. Więc po prostu rozszerza Poet::Import, dodając kolejny „atrybut” (Twój „zmienna”) do niego.

w powyższym przykładzie

  • dodany atrybut mytemp
  • i chce zadzwonić do zmiennej globalnej jako $mytemp.

teraz można użyć to na przykład w twoich komponentach. Edytuj swoją comps/index.mc.

Do góry Dodaj

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

i dodać następujące też:

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

The $mytemp pomocą use Poet qw($mytemp); jest importowany z My/Import.pm. (jest tylko do odczytu, zgodnie z definicją - (is => 'ro',...).

Wszystko w Poet/Mason jest Moose :), więc (oczywiście) można importować rw zmienną dowolnego isa ... itd

Wystarczy pamiętać, powyższe jest prawdą zmienna globalna i trwałe. Na przykład. jego treść jest zachowywana między żądaniami. W większości przypadków nie chcesz używać takich zmiennych, tylko w kilku szczególnych przypadkach, na przykład, chcesz zainicjować pewien uchwyt bazy danych $dbh (co powinno być dostępne przy uruchomieniu aplikacji) i takie.

Po drugie, tutaj jest również metoda $m->notes, ale nie należy jej nadmiernie wykorzystywać.Od docs:

notach() metoda zapewnia miejsce do przechowywania danych aplikacji pomiędzy komponentów - Zasadniczo, hash, który utrzymuje się przez cały czas trwania wniosku.

Należy rozważyć przechowywanie tego rodzaju danych w atrybucie do odczytu i zapisu składnika strony .

W większości przypadków wystarczy użyć prostych atrybutów komponentów, np. zobacz na przykład w wygenerowanej domyślnej aplikacji użycie $.title (np. $ self-> title).

Albo po prostu może przejść do zmiennych składników jak argumenty,

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

i tak dalej ...

Ponownie, każdy component jest:

  • tylko wielbłąd
  • z porożami
  • za pomocą niektórych narzędzi do murowania
  • w poetyckiej środowiska
  • na górze PSGI wzgórze

:)

+3

dziękuję za odpowiedź. Tego właśnie szukałem. Ponieważ przegapiłeś nagrodę, po prostu zacząłem nagrodę za bajerkę, a nagrodę otrzymam najszybciej jak będę mógł. – fthiella

+2

Jest to rodzaj interakcji, która sprawia, że ​​SO świetnie :) – nha

+2

@Nha YW! i thanx za komentarz. ;) – jm666