我正在使用Mojo应用程序,我希望能够使用一些Moose角色来让我的生活更轻松。
在CPAN上,我看到MojoX::Moose::Controller,其内部非常简单。我没有看到使用Moose和Mojo的其他很多东西。我应该注意的任何潜在问题还是一帆风顺?
答案 0 :(得分:6)
根据我的经验,他们一起工作得很好。我已经用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!!" );
}
}
答案 1 :(得分:4)
自从我最初提出这个问题以来,我们已经将一些Mojo + Moose代码转移到了生产中。我将在这里分享一些警告。这个答案实际上是由Florian Ragwitz写的。我代表他发帖。
Mojolicious和Moose可以很好地一起玩,但是必须要注意让事情顺利进行,并且有一些警告。
使用Moose的构造函数创建新对象非常重要。运用
MooseX::NonMoose
是确保这一点的简单方法。没有打电话给驼鹿
在对象构造期间,许多Moose功能,例如BUILDARGS
,BUILD
,
属性类型约束检查,并且急切的构建器将无法工作。
MooseX::NonMoose
也会委托原Mojolicious::Controller
构造函数,它具有仅仅祝福构造函数参数的行为
提供到哈希引用中。这可能会导致一些奇怪的结果。
例如:
package MyController;
use Moose;
use MooseX::NonMoose;
extends 'Mojolicious::Controller';
has foo => (init_arg => 'bar');
稍后......
MyController->new(bar => 42) # bless { foo => 42, bar => 42 }, 'MyController'
注意生成的有福哈希引用如何包含键foo
和
bar
,而不仅仅是你对常规Moose课程所期望的bar
。这个
通常不是问题,只要你不打算使用对象槽
与另一个属性init_arg
相同的名称。
Moose扩展也可以使用。 Mojo需要基于哈希的实例,因此您将无法使用Moose提供的任何非基于哈希的元实例,例如MooseX::GlobRef
和MooseX::ArrayRef
。 MooseX::StrictConstructor
也不起作用
这个环境,因为Moose无法分辨哪个构造函数的参数
打算由Mojo构造函数使用。
总的来说,结合Mojolicious和Moose应该在实践中很好地工作 只要你知道小的警告,并且没有能力使用就行了 某些Moose扩展。
答案 2 :(得分:3)
他们绝对玩得很好。我已经构建了一个在20个服务器的集群上运行的API。它是一个mojo应用程序,它也使用了消耗多个角色的moose类。
我采用的方法是将应用程序正确分层,直到存储层。在这方面,mojo仅在堆栈的上层才真正需要。在早期,我创建了一个基于moose的请求对象,然后将其向下推送到堆栈中。向下,创建一个基于驼鹿的响应对象,该响应对象将响应传递回堆栈的上层。最后,mojo接管并处理最终的json响应。
我们通过堆栈推动了大量的生产流量,并且表现非常出色。我做的一件事是确保尽可能使用XS版本的模块,因为这提高了堆栈的性能。