9. Invocado por el dispatcher
Manipulación de capturas del router
Validaciones
Pegamento entre otros componentes:
modelos y vistas
Idealmente poco código: thin controller,
fat models.
21. Catalyst
Crear nueva App
$ catalyst.pl MyCatApp
created "MyCatApp"
created "MyCatApp/script"
created "MyCatApp/lib"
created "MyCatApp/root"
created "MyCatApp/root/static"
...
created "MyCatApp/script/mycatapp_server.pl"
created "MyCatApp/script/mycatapp_test.pl"
created "MyCatApp/script/mycatapp_create.pl"
29. package Curs::App::Controller::Root;
use Moose; use namespace::autoclean;
BEGIN { extends 'Catalyst::Controller' }
__PACKAGE__->config(namespace => '');
sub index :Path :Args(0) {
my ( $self, $c ) = @_;
$c->response->body($c->welcome_message);
}
sub default :Path {
my ( $self, $c ) = @_;
$c->response->body('Page not found');
$c->response->status(404);
}
sub end : ActionClass('RenderView') {}
38. Nuevo Controller
$ ./script/curs_app_create.pl controller Example
exists ".../Curs-App/script/lib/Curs/App/Controller"
exists ".../Curs-App/script/t"
created ".../Curs-App/lib/Curs/App/Controller/Example.pm"
created ".../Curs-App/t/controller_Example.t"
51. Antes de la acción, solo una vez
sub begin :Private {}
Despues de la acción, solo una vez
sub end :Private {}
Despues de begin, de menos especifico a mas
especifico
sub auto :Private {}
Si retorna false se salta hasta end()
56. $ script/curs_app_create.pl view Web TT
exists ".../Curs-App/script/../lib/Curs/App/View"
exists ".../Curs-App/script/../t"
created ".../Curs-App/script/../lib/Curs/App/View/Web.pm"
created ".../Curs-App/script/../t/view_Web.t"
65. Uso de View::JSON
sub status :Path('/status') :Args(0) {
my ( $self, $c ) = @_;
$c->stash(
json => { value => 'testing' }
);
$c->forward('View::JSON');
}
67. Curs::Schema
$ script/curs_app_create.pl model DB DBIC::Schema Curs::Schema
exists ".../Curs-App/script/../lib/Curs/App/Model"
exists ".../Curs-App/script/../t"
created ".../Curs-App/script/../lib/Curs/App/Model/DB.pm"
created ".../Curs-App/script/../t/model_DB.t"
68. Config por defecto
curs_app.conf
name Curs::App
<Model::DB>
connect_info dbi:SQLite:dbname=curs_schema
connect_info
connect_info
<connect_info>
sqlite_unicode 1
RaiseError 1
</connect_info>
</Model::DB>
85. =head2 need_login
Ensure user exists on the chain.
=cut
sub need_login :PathPart( '' )
Chained( '/' ) CaptureArgs( 0 ) {
my ( $self, $c ) = @_;
unless ( $c->user_exists ) {
$c->session->{after_login_path} = '/' . $c->
$c->res->redirect(
$c->uri_for_action(
$c->controller('Auth')
->action_for('login')
)
);
$c->detach;
}
}
86. =head2 need_role_admin
Ensure user with the admin role.
=cut
sub need_role_admin :PathPart('admin')
Chained('need_login') CaptureArgs(0) {
my ( $self, $c ) = @_;
unless ( $c->check_user_roles( 'admin' ) ) {
$c->res->body('You need admin role for this
$c->detach();
}
}
88. =head2 element_chain
Base chain for actions related to one user
=cut
sub element_chain
:PathPart('user')
Chained('/auth/need_login')
CaptureArgs(1) {
my ( $self, $c, $user_id ) = @_;
$c->stash(
user => $c->model('DB::User')
->find( $user_id )
);
unless ( $c->stash->{user} ) {
$c->detach( '/error/element_not_found', [ 'u
}
}
89. sub view :PathPart()
Chained('element_chain') Args(0) {
my ( $self, $c ) = @_;
$c->stash( template => 'user/view.tt' );
}
sub delete :PathPart()
Chained('element_chain') Args(0) {
my ( $self, $c ) = @_;
$c->stash->{user}->delete;
# ...
}
98. package Curs::App::Controller::Event;
use Moose; use namespace::autoclean;
BEGIN {extends 'Catalyst::Controller'}
has model_name => ( is => 'ro', default => 'DB::
with 'Curs::App::TraitFor::Controller::WithDBIC'
sub base_chain :PathPart('event')
Chained('/') CaptureArgs(1) {}
sub delete :PathPart('delete') Chained('item') A
my ( $self, $c ) = @_;
$c->stash->{event}->delete;
}
101. $ cpanm -n Starman
...
$ starman curs_app.psgi
2012/03/10-11:25:36 Starman::Server
(type Net::Server::PreFork) starting! pid(73661)
Binding to TCP port 5000 on host *
Setting gid to "20 20 20 204 100 98 81 80 79 61
102. Más Catalyst
IRC
#catalyst en irc.perl.org.
#catalyst-dev en irc.perl.org (desarrollo).
Mailing lists
http://lists.scsys.co.uk/mailman/listinfo/catalyst
http://lists.scsys.co.uk/mailman/listinfo/catalyst-
dev
103. Manual
Ejercicios
https://metacpan.org/module/Catalyst::Manual
Añadir un metodo (API) que deje ver
datos de UN usuario en JSON:
/user/1/json
Extra: vista json que devuelva array de
usuarios (sin repetir codigo)
Añadir una vista que liste los eventos
(Creados en la práctica anterior)
Crear una acción (solo para admins), un
formulario y su plantilla para crear un
evento y otra para editarlo.