oal*_*ers 9 perl moose mojolicious
我正在开发一个Mojo应用程序,我希望能够使用一些Moose角色来让我的生活更轻松.
在CPAN上,我看到MojoX :: Moose :: Controller,它具有非常简单的内部结构.我没有看到使用Moose和Mojo的其他内容.我应该注意的任何潜在问题还是一帆风顺?
根据我的经验,他们一起工作得很好.我已经用Moose成功构建了Mojolicious应用程序(Moo也可以正常工作.)
Moose可以扩展基础Mojolicious控制器类,然后你可以做任何你想要的通常Moose事情.这是一个例子:
package MyApp {
use Moose;
extends 'Mojolicious';
with 'MyApp::Role::Whatever';
sub startup {
my $self = shift;
my $r = $self->routes;
$r->get('/')->to('foo#default');
}
}
package MyApp::Foo {
use Moose;
extends 'Mojolicious::Controller';
sub default {
my $self = shift;
$self->render( text => "Helloooooo!!" );
}
}
Run Code Online (Sandbox Code Playgroud)
自从我最初问这个问题的时间以来,我们已经将一些Mojo + Moose代码投入了生产。我将在此分享一些警告。这个答案实际上是弗洛里安·拉格维茨(Florian Ragwitz)撰写的。我代表他发帖。
Mojolicious和Moose可以玩得很好,但是必须注意某些事情才能正常工作,并且有一些警告。
使用Moose的构造函数来创建新对象非常重要。使用
MooseX::NonMoose是确保这一点的简便方法。如果没有对象施工期间调入驼鹿,麋鹿许多功能,如BUILDARGS,BUILD,属性类型约束检查,并渴望建设者将无法正常工作。
MooseX::NonMoose也将委托给原始Mojolicious::Controller
构造函数,该构造函数的行为只是祝福提供给哈希引用的构造函数参数。这可能会导致一些奇怪的结果。
例如:
package MyController;
use Moose;
use MooseX::NonMoose;
extends 'Mojolicious::Controller';
has foo => (init_arg => 'bar');
Run Code Online (Sandbox Code Playgroud)
稍后的...
MyController->new(bar => 42) # bless { foo => 42, bar => 42 }, 'MyController'
Run Code Online (Sandbox Code Playgroud)
请注意,所得的有福哈希引用如何包含键foo和
bar,而不是bar像常规的Moose类所期望的那样。只要您不打算使用与另一个属性的名称相同的对象插槽,通常就没有问题init_arg。
关于可以使用的Moose扩展名也有一些限制。Mojo需要基于哈希的实例,因此您将无法使用Moose提供的任何非基于哈希的元实例,例如MooseX::GlobRef和MooseX::ArrayRef。MooseX::StrictConstructor在这种环境下也不会工作,因为Moose无法确定Mojo构造函数要使用哪些构造函数参数。
总体而言,将Mojolicious和Moose结合使用在实践中应该会非常有效,只要您知道一些小警告,并且可以使用某些Moose扩展名即可。