CGI::Application 是个轻量级的web框架,呃。。。其实只是个基本基本的框架 :)。不过,它有好多的扩展,利用这么扩展模块,我们自己来实现一个 MVC 的 web 框架也不是难事。
先看看咱们这个框架的目录结构:
MyWeb/ - start.pl
|- lib/ - MyWeb.pm
| |- MyWeb/ - Dispatch.pm
| - Search.pm
| .....
|- config/
|- db/
|- template/
|- tools/
MyWeb.pm
package MyWeb;
use strict; use warnings;
use base 'CGI::Application';
use CGI::Application::Plugin::Config::Simple; use CGI::Application::Plugin::AutoRunmode; use CGI::Application::Plugin::AnyTemplate; use CGI::Application::Plugin::Session; use CGI::Application::Plugin::ValidateRm;
use Class::DBI::Loader; use Class::DBI::Pageset;
sub cgiapp_init { my $self = shift;
$self->header_add( -charset => 'GBK'); $self->config_file('./config/site.ini'); $self->{'__cdbi__loader__'} = Class::DBI::Loader->new( dsn => $self->config_param('db.dsn'), user => $self->config_param('db.user'), passsword => $self->config_param('db.password'), namespace => 'MyWeb', additional_classes => qw/Class::DBI::Pageset/, ); $self->template->config( default_type => 'TemplateToolkit', include_paths => './template', auto_add_template_extension => 0, ); $self->session_config(); }
sub teardown { my $self = shift; } 1;
|
有了 AutoRunmode 和 Dispatch, start.pl 就很简单了
#!/usr/bin/perl
use strict; use warnings;
use lib './lib'; use MyWeb::Dispatch;
MyWeb::Dispatch->dispatch();
|
下面看看 Dispatch 的示例
package MyWeb::Dispatch;
use strict; use warnings;
use base 'CGI::Application::Dispatch';
sub dispatch_args { return { args_to_new => { TMPL_PATH => './template/', }, prefix => 'MyWeb', table => [ '' => { app => 'View', }, ':app' => {}, ':app/:rm' => {}, ':app/:rm/:id' => {}, ], }; }
1
|
再给个 control 的示例 View.pm
package MyWeb::View;
use strict; use warnings;
use base 'MyWeb';
# # Runmodes ----------------------- # sub default : StartRunmode { my $self = shift;
$self->template->fill('default.tt'); } sub node : Runmode { my $self = shift; }
sub error : ErrorRunmode {} 1;
|
Search.pm
package MyWeb::Search;
use strict; use warnings;
use base 'MyWeb'; use URI::Escape;
# # Runmodes ----------------------- #
sub default : StartRunmode { my $self = shift; my %tables = ( '中药' => 'zhongyao', '方剂' => 'fj_info_gb2312', '西药' => 'xiyao', '辞典' => 'fangji', ); my $q = $self->query->param('q'); # if $q is null, it should be redirected to an error page...
my $meta = $self->query->param('meta'); my $query = '%' . $q . '%'; my $dict = $self->{'__cdbi__loader__'}->find_class($tables{"$meta"});
my $pager = $dict->pager({ entries_per_page => 20, current_page => $self->query->param('page') || 1, pages_per_set => 5, }); my $results = $pager->search_like(mingcheng => $query); $self->template->fill('search.tt', { results => $results, pager => $pager, q => uri_escape($q), meta => uri_escape($meta), lib => uri_escape($meta),} );
}
=head sub node : Runmode { my $self = shift; } =cut
sub error : ErrorRunmode {}
1;
|
在 Search.pm 这个例子中,因为我们用了 Class::DBI::Loader Class::DBI::Pageset,所以可以很轻松的查询并实现分页显示,我们都不用写SQL代码!
阅读(779) | 评论(0) | 转发(0) |