我正在研究一个Mojo应用程序,我希望能够消耗一些驼鹿角色来让我的生活更轻松。Mojolicious和Moose一起玩吗?
在CPAN上,我看到MojoX::Moose::Controller,它具有非常简单的内部结构。我没有看到与Mojo一起使用Moose的其他内容。我应该意识到的任何潜在问题还是仅仅是一帆风顺?
我正在研究一个Mojo应用程序,我希望能够消耗一些驼鹿角色来让我的生活更轻松。Mojolicious和Moose一起玩吗?
在CPAN上,我看到MojoX::Moose::Controller,它具有非常简单的内部结构。我没有看到与Mojo一起使用Moose的其他内容。我应该意识到的任何潜在问题还是仅仅是一帆风顺?
以我的经验,他们一起工作得很好。我已经成功地使用Moose构建了Mojolicious应用程序(并且Moo也应该很好地工作)。
驼鹿可以扩展基本的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!!");
}
}
如果您使用Moose来扩展非Moose类,那么您确实应该使用MooseX :: NonMoose来避免构造函数中的冲突(以及其他问题)。 – Ether
他们肯定打得很好。我已经构建了一个在20台服务器上运行的API。这是一个mojo应用程序,它也使用消耗多个角色的驼鹿类。
我采取的方法是正确地将应用程序分层到存储层。在这方面,魔咒只在堆叠中的上层才需要。早期我创建了一个基于驼鹿的请求对象,然后按下堆栈。降低时,会创建一个基于驼鹿的响应对象,将响应传递回堆栈的上层。最后,mojo接管并处理最终的json响应。
我们正在推动大量的生产流量通过堆栈,它表现出色。我做的一件事是确保在可能的情况下使用XS版本的模块,因为这样可以提高堆栈的性能。
自从我最初提出这个问题以来,我们已经将一些Mojo + Moose代码投入生产。我会在这里分享一些警告。这个答案实际上是由Florian Ragwitz写的。我代表他发布信息。
Mojolicious和Moose可以一起玩,但必须注意一些事情才能正常工作,并且有一些注意事项。
Moose的构造函数用于创建新对象很重要。使用 MooseX::NonMoose
是确保这一点的简单方法。在对象构造过程中,如果没有调用Moose ,许多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
,而不是仅仅bar
如你所期望从一个普通的穆斯类。只要您不打算使用 与其他属性的init_arg
相同的名称,则此 通常不是问题。
对于可以使用哪些Moose扩展还有限制。 Mojo需要基于散列的实例,因此您将无法使用Moose提供的任何非基于散列的元实例,如MooseX::GlobRef
和MooseX::ArrayRef
。 MooseX::StrictConstructor
也不会在 这个环境中工作,因为Moose无法知道哪个构造函数参数是 意图被Mojo构造函数使用。
总的来说,结合Mojolicious和Moose在实践中应该能够很好地工作,因为您知道这些小警告并且没有能力使用 某些驼鹿扩展。
在Perl的IRC服务器上检查Mojolicious Google小组或#mojo。 –
谢谢。我实际上在IRC上,所以这将是我的下一步行动,但我认为这将对那些不在IRC上的人记录答案会有所帮助。 – oalders