NAME
YATT::Lite::WebMVC0::SiteApp - PSGI Handler for yatt
SYNOPSIS
# In app.psgi
use FindBin;
use YATT::Lite::WebMVC0::SiteApp -as_base;
use YATT::Lite qw/Entity *CON/;
return do {
my $site = MY->new(doc_root => "$FindBin::Bin/html");
#----- You can define entities here. ----
Entity session => sub {
my ($this, $key) = @_;
my $sess = $CON->get_session
or return;
$sess->param($key);
};
if (YATT::Lite::Factory->want_object) {
# When app.psgi is loaded from yatt support scripts(eg. yatt lint),
# return bare object, not app.
$site;
} else {
# Otherwise, normal PSGI. You can use Plack::Builder and/or middleware.
$site->to_app;
}
};
DESCRIPTION
SiteApp
is a Factory of DirApp, which is a web specific subclass of YATT::Lite.
SiteApp takes a template directory tree at startup and becomes a PSGI application.
When SiteApp called for incoming request, it first determins a sub-directory for the request. Then SiteApp looks for DirApp from own cache, load/build it when necessary, and finally invoke DirApp to handle do rest of work.
CONFIGS
SiteApp accepts YATT::Lite::Object style configurations.
doc_root
Document root of this PSGI application. *.yatt should be placed under this. Usually, $FindBin::Bin/html
app_ns
Namespace of per-directory YATT::Lite class. Default is MyYATT
. This will also be used as a base class of each YATT::Lite
instances. This class will be loaded at startup (but can be missing). If it exists, it must be a subclass of YATT::Lite
.
app_root
The application directory where app.psgi lives in. Sometime omissible, but recommended to set as $FindBin::Bin
.
app_base
Base DirApp for all DirApp under doc_root
. A.k.a inheritance of app-directory. Omissible. Usually, $FindBin::Bin/ytmpl.
site_prefix
If your app.psgi is located under subpath, specify this. You can refer this from *.yatt via &yatt:site_prefix();
.
header_charset
Default charset for HTTP response headers. Default is utf-8.
tmpl_encoding, output_encoding
Encoding of *.yatt and HTTP response body, respectively.
XXX: should note about widechars....
no_nested_query
By default, yatt turns specific parameters into hashes/arrays like PHP and Ruby on Rails. This feature is useful(I hope), but is experimental. So if you don't want this feature, turn this config on.
psgi_static
Requests other than *.yatt, *.ytmpl, *.ydo are passed to this PSGI app. Default is:
Plack::App::File->new(root => $self->{cf_doc_root})->to_app
backend
Room for your Model instance. If it is given and it has startup
method is implemented, $backend->startup($siteapp, @all_dirapps)
will be called when prepare_app
.
METHODS
call($env)
PSGI entry function. SiteApp uses $env
as following:
- PATH_TRANSLATED, REDIRECT_STATUS
-
If
$env->{REDIRECT_STATUS}
is200
and has non empty$env->{PATH_TRANSLATED}
, yatt tries to serve specified path. - PATH_INFO
-
Otherwise, yatt examines
$env->{PATH_INFO}
under doc_root and app_base, in this order.
prepare_app
PSGI startup hook.
render($path_info, $args)
Aid for batch execution.
make_connection($parent_fh, @config)
Build helper for YATT::Lite::WebMVC0::Connection object. $parent_fh
can be undef. If specified, $con->flush
will flush buffered contents to $parent_fh.