Mojolicious和Moose一起玩得好吗?

oal*_*ers 9 perl moose mojolicious

我正在开发一个Mojo应用程序,我希望能够使用一些Moose角色来让我的生活更轻松.

在CPAN上,我看到MojoX :: Moose :: Controller,它具有非常简单的内部结构.我没有看到使用Moose和Mojo的其他内容.我应该注意的任何潜在问题还是一帆风顺?

fri*_*edo 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!!" );
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果你使用Moose扩展非Moose类,你真的应该使用MooseX :: NonMoose来避免构造函数中的冲突(以及其他问题). (2认同)

oal*_*ers 5

自从我最初问这个问题的时间以来,我们已经将一些Mojo + Moose代码投入了生产。我将在此分享一些警告。这个答案实际上是弗洛里安·拉格维茨(Florian Ragwitz)撰写的。我代表他发帖。

Mojolicious和Moose可以玩得很好,但是必须注意某些事情才能正常工作,并且有一些警告。

使用Moose的构造函数来创建新对象非常重要。使用 MooseX::NonMoose是确保这一点的简便方法。如果没有对象施工期间调入驼鹿,麋鹿许多功能,如BUILDARGSBUILD,属性类型约束检查,并渴望建设者将无法正常工作。

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)

请注意,所得的有福哈希引用如何包含键foobar,而不是bar像常规的Moose类所期望的那样。只要您不打算使用与另一个属性的名称相同的对象插槽,通常就没有问题init_arg

关于可以使用的Moose扩展名也有一些限制。Mojo需要基于哈希的实例,因此您将无法使用Moose提供的任何非基于哈希的元实例,例如MooseX::GlobRefMooseX::ArrayRefMooseX::StrictConstructor在这种环境下也不会工作,因为Moose无法确定Mojo构造函数要使用哪些构造函数参数。

总体而言,将Mojolicious和Moose结合使用在实践中应该会非常有效,只要您知道一些小警告,并且可以使用某些Moose扩展名即可。