рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛Habr├й рдкрд░ рдмрд╣реБрдд рдХрдо рд╣реИрдВ, рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рдЙрддреНрдкреНрд░реЗрд░рдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЕрджреНрднреБрдд MVC рдврд╛рдВрдЪреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рдХреЛрдИ рд▓реЗрдЦ рдирд╣реАрдВ рд╣реИред рдФрд░ рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЕрдкрдирд╛ рдкрд╣рд▓рд╛ рд▓реЗрдЦ рдЙрдиреНрд╣реЗрдВ рд╕рдорд░реНрдкрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред
рдпрд╣рд╛рдВ рдореИрдВрдиреЗ рдПрдХ рд╕рд░рд▓ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрддреНрдкреНрд░реЗрд░рдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреБрдирд┐рдпрд╛рджреА рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛, рдЗрд╕ рдврд╛рдВрдЪреЗ рдХреЛ рдорд╛рд╣рд┐рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрдерд╛рдХрдерд┐рдд рддреНрд╡рд░рд┐рдд рд╢реБрд░реБрдЖрдд
рдкрд░рд┐рдЪрдпрдХреИрдЯрд▓ рдкрд░реНрд▓ рдореЗрдВ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдПрдорд╡реАрд╕реА рдврд╛рдВрдЪрд╛ рд╣реИред
MVC рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрдж (рдореЙрдбрд▓ / рджреЗрдЦреЗрдВ / рдирд┐рдпрдВрддреНрд░рдХ):
- рдореЙрдбрд▓ (рдореЙрдбрд▓) - рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдбреЗрдЯрд╛ рдФрд░ рд╡рд┐рдзрд┐рдпрд╛рдБ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
- рджреГрд╢реНрдп (рджреЗрдЦреЗрдВ) - рдпрд╣ рдбреЗрдЯрд╛ рдХреИрд╕реЗ рджрд┐рдЦреЗрдЧрд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред
- рдирд┐рдпрдВрддреНрд░рдХ (рдирд┐рдпрдВрддреНрд░рдХ) - рд╕рд┐рд╕реНрдЯрдо рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдмреАрдЪ рд╕рдВрдЪрд╛рд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЖрд╡реЗрджрди рдХреЗ рджреМрд░рд╛рди рдЖрд╡рд╢реНрдпрдХ рдмрд╛рддрдЪреАрдд рдХреЛ рднреА рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред
рдЙрддреНрдкреНрд░реЗрд░рдХ - рдореЗрдВ рд╕реАрдкреАрдПрдПрди рдореЙрдбреНрдпреВрд▓ рдХреА рдПрдХ рд╡реНрдпрд╛рдкрдХ рд╕рдВрдЦреНрдпрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рдкрд░реНрд▓ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИред
рдЗрд╕ рдврд╛рдВрдЪреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд░рд▓рддрд╛ рдХреНрдпрд╛ рд╣реИ?
рдПрдХ рдирдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
catalyst.pl Test::App
(рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдирд╛рдо рдХреЗ рд╕рд╛рде "::" рдЗрд╕реЗ "-" рджреНрд╡рд╛рд░рд╛ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдпрд╣ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреИрдЯрд▓рд┐рд╕реНрдЯ :: рд╣реЗрд▓реНрдкрд░ рдирд╛рдордХ рдПрдХ рд╕рд╣рд╛рдпрдХ рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдЬреЛ рднрд╡рд┐рд╖реНрдп рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ, рдлрд╝реЛрд▓реНрдбрд░, рдкрд░реАрдХреНрд╖рдг, рдлрд╝рд╛рдЗрд▓реЗрдВ рдЖрджрд┐ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред
рдирд┐рд░реНрдорд┐рдд рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╕рдВрд░рдЪрдирд╛:
- / lib - рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рджрд┐рд▓, рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЗрдЪреНрдЫрд┐рдд рд╕рднреА рдкрд░реНрд▓ рдХреЛрдб, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдмрдирд╛рдП рдЧрдП рдЙрдкрдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВ:
- рдЯреЗрд╕реНрдЯ / рдРрдк / рдореЙрдбрд▓ - рдореЙрдбрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП;
- рдЯреЗрд╕реНрдЯ / рдРрдк / рджреЗрдЦреЗрдВ - ... рджреЗрдЦреЗрдВ;
- рдкрд░реАрдХреНрд╖рдг / рдРрдк / рдирд┐рдпрдВрддреНрд░рдХ - ... рдирд┐рдпрдВрддреНрд░рдХ;
- рдкрд░реАрдХреНрд╖рдг / рдЕрдиреБрдкреНрд░рдпреЛрдЧ / App.pm - рдПрдХ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ред
- / рд░реВрдЯ - рд╡реНрдпреВ рдХреЗ рд▓рд┐рдП рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдпрд╣рд╛рдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВ, рдЖрд╡рд╢реНрдпрдХ рд╕реАрдПрд╕рдПрд╕, рдЬреЗрдПрд╕, рдЫрд╡рд┐рдпрд╛рдВ, рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ, рд╕рднреА рд╕реНрдереИрддрд┐рдХ рдбреЗрдЯрд╛;
- / рд╕реНрдХреНрд░рд┐рдкреНрдЯ - рдРрд╕реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╣реЗрд▓реНрдкрд░ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рдереАрдВред рдЙрдиреНрд╣реЗрдВ рдЪрд▓рд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ:
- рдкрд░реАрдХреНрд╖рдг рд╕рд░реНрд╡рд░;
- рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ URL рдХрд╛ рдкрд░реАрдХреНрд╖рдг;
- MVC рдШрдЯрдХреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг;
- CGI / FastCGI рдЬреИрд╕реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдиреЗ;
- рдЖрджрд┐
- / t - рдкрд░реАрдХреНрд╖рдг рд╢рд╛рдорд┐рд▓ рд╣реИрдВ
- рдкрд░рд┐рд╡рд░реНрддрди - рдЖрдкрдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдЗрддрд┐рд╣рд╛рд╕ред
- Makefile.PL - рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рддреИрдирд╛рдд рдХрд░рддреЗ рд╕рдордп рдЖрд╡рд╢реНрдпрдХ рдореЙрдбреНрдпреВрд▓ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрд╡рд╛ рдХреА рдЬрд╛рдирдХрд╛рд░реАред
- test_app.conf - рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓, рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдЪрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИрдВ (рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдЕрдВрджрд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рд╕рд░реНрд╡реЛрдЪреНрдЪ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реИ)ред
- README - рдЖрд╡реЗрджрди рдХреЗ рд▓реЙрдиреНрдЪ, рдЗрд╕рдХреА рд╕реНрдерд╛рдкрдирд╛, рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдЖрджрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реАред
рдЙрдкрдпреБрдХреНрдд рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрд╡рд╢реНрдпрдХ рдореЙрдбрд▓ / рд╡рд┐рдЪрд╛рд░ / рдирд┐рдпрдВрддреНрд░рдХ рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВ:
script/test_app_create.pl {model|view|controller} { }
TestApp.pm рдлрд╝рд╛рдЗрд▓ рд╕рд╛рдордЧреНрд░реА
package Test::App; use Moose; use namespace::autoclean; use Catalyst::Runtime 5.80; use Catalyst qw/ -Debug
рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХреИрдЯрд▓рд┐рд╕реНрдЯ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП CPAN рддрддреНрд╡реЛрдВ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдореВрд╕ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдкрд░реНрд▓ рднрд╛рд╖рд╛ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЛ рдмрд╣реБрдд рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИред
Root.pm / / / lib / Test / App / Controller / folder рдореЗрдВ рд╕реНрдерд┐рдд рдлрд╝рд╛рдЗрд▓ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ:
рдЕрдм, рдЗрд╕ рд░реВрдкрд░реЗрдЦрд╛ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдЗрдП рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред
1.
script/test_app_create.pl view Web TT
рдХрдорд╛рдВрдб (TT - рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЯреВрд▓рдХрд┐рдЯ, рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЗрдВрдЬрди) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рджреГрд╢реНрдп рдмрдирд╛рдПрдВ, рдЖрдк рдЕрдиреНрдп рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрдВрдЬрди, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдореЗрд╕рди рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)
2. рд░реВрдЯ / рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ index.tt рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдПрдБ
рдЗрд╕ рдХреЛрдб рдХреЛ рд╡рд╣рд╛рдВ рдкреЗрд╕реНрдЯ рдХрд░реЗрдВ:
[% IF result %]<p>[% result %]</p> [% END %] <form name="hello" method=POST action="hello"> <input type="text" name="hi" value=""> <input type="submit" value="Do something!"> </form>
3. Root.pm рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рдирд┐рдореНрди рдкрдВрдХреНрддрд┐ рд╣рдЯрд╛рдПрдВ:
$c->response->body( $c->welcome_message ); #
$c->response->body( $c->welcome_message ); #
4. рд╡рд╣рд╛рдБ рд╣рдо рдирдорд╕реНрддреЗ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:
sub hello :Local { my ($self, $c) = @ _; my $hi = $c->req->body_params->{hi}; $c->stash( result => $c->model('Hello')->hello($hi), template => 'index.tt', ); }
5. рдПрдХ рдореЙрдбрд▓
script/test_app_create.pl Model Hello
рдмрдирд╛рдПрдВ
script/test_app_create.pl Model Hello
script/test_app_create.pl Model Hello
6. рдмрдирд╛рдП рдЧрдП рдореЙрдбрд▓ рдореЗрдВ, рд╡рд┐рдзрд┐ рд▓рд┐рдЦреЗрдВ:
sub hello { my ($self, $hi) = @ _; return "Hello $hi!\n"; }
7. рдкрд░реАрдХреНрд╖рдг рд╕рд░реНрд╡рд░
script/test_app_server
8. рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ, рджрд░реНрдЬ рдХрд░реЗрдВ
localhost:3000/
localhost:3000/
(рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреЛрд░реНрдЯ)
рд╣рдо рдкрд░рд┐рдгрд╛рдо рдХреА рдкреНрд░рд╢рдВрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВред
PS рдпрд╣рд╛рдБ рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рдЬрдм рдЙрддреНрдкреНрд░реЗрд░рдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдореИрдВ рдЗрд╕ рд░реВрдкрд░реЗрдЦрд╛ рдХреЗ рд▓реЛрдЧреЛрдВ рд╕реЗ рд╣рдм рдкрд░ рдЕрдзрд┐рдХ рд▓реЗрдЦ рдЪрд╛рд╣реВрдВрдЧрд╛, рдЬреЛ рд▓реЛрдЧ рдЬрд╛рдирддреЗ рд╣реИрдВред рдкреНрд░рд▓реЗрдЦрди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдиреБрднрд╡ рд╣рдореЗрд╢рд╛ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрддрд╛ рд╣реИред
рдкреАрдкреАрдПрд╕ рдЗрд╕ рд▓реЗрдЦ рдХреЛ рд▓рд┐рдЦрддреЗ рд╕рдордп, рдпрд╣ рдореЛрддреА рдХреЗ рдЬрд╛рджреВ рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдерд╛ред рдХреЛрдб "@_" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЯреИрдЧ рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм "_" рдирд╛рдо рдХреЗ рд╕рд╛рде рд╣рдмреНрд░рд╛рдпреБрдЬрд╝рд░ рдореЗрдВ рдореЛрддреА рднрд╛рд╖рд╛ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реБрдП, @ рдФрд░ _ рдХреЗ рдмреАрдЪ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рд╕реБрдВрджрд░ рдирд╣реАрдВ рдЖрдпрд╛ред рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВ ...