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的子类。

标签