Mojolicious路由(六)
一、特殊stash值
调度器会一直将stash中controller和action关键字的值,一一对应的去查找类和方法。Controller值在Mojo::Util中使用”camelize”从snake_case(蛇形命名法则)转换为CamelCase(驼峰命名法则),并附加到一个或多个名称空间,默认为一个基于应用程序类的控制器命名空间(MyApp:: controller),以及裸应用程序类(MyApp),这些名称空间是按照这个顺序搜索的。action值根本没有改变,所以两个值都是区分大小写的。
# Application
package MyApp;
use Mojo::Base 'Mojolicious', -signatures;
sub startup ($self) {
# /bye -> MyApp::Controller::Foo->bye
$self->routes->get('/bye')->to(controller => 'foo', action => 'bye');
}
1;
# Controller
package MyApp::Controller::Foo;
use Mojo::Base 'Mojolicious::Controller', -signatures;
# Action
sub bye ($self) {
# Render response
$self->render(text => 'Good bye.');
}
1;
控制器类非常适合在大型项目中组织代码。有更多的调度策略,但因为控制器是最常用的,所以它们也有一个特殊的快捷方式controller#action。
# /bye -> {controller => 'foo', action => 'bye', mymessage => 'Bye'}
$r->get('/bye')->to('foo#bye', mymessage => 'Bye');
在camelization过程中 – 字符被::替换,这允许多级控制器层次结构。
# / -> MyApp::Controller::Foo::Bar->hi
$r->get('/')->to('foo-bar#hi');
你也可以用驼峰形式而不是蛇形命名法则来指定控制器。
# / -> MyApp::Controller::Foo::Bar->hi
$r->get('/')->to('Foo::Bar#hi');
出于安全原因,调度程序在调度控制器之前总是会检查它是否是Mojolicious:: controller或Mojo的子类。