Mojolicious和Moose一起玩得好吗?

时间:2015-06-12 13:54:05

标签: perl moose mojolicious

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

在CPAN上,我看到MojoX::Moose::Controller,其内部非常简单。我没有看到使用Moose和Mojo的其他很多东西。我应该注意的任何潜在问题还是一帆风顺?

3 个答案:

答案 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功能,例如BUILDARGSBUILD, 属性类型约束检查,并且急切的构建器将无法工作。

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'

注意生成的有福哈希引用如何包含键foobar,而不仅仅是你对常规Moose课程所期望的bar。这个 通常不是问题,只要你不打算使用对象槽 与另一个属性init_arg相同的名称。

Moose扩展也可以使用。 Mojo需要基于哈希的实例,因此您将无法使用Moose提供的任何非基于哈希的元实例,例如MooseX::GlobRefMooseX::ArrayRefMooseX::StrictConstructor也不起作用 这个环境,因为Moose无法分辨哪个构造函数的参数 打算由Mojo构造函数使用。

总的来说,结合Mojolicious和Moose应该在实践中很好地工作 只要你知道小的警告,并且没有能力使用就行了 某些Moose扩展。

答案 2 :(得分:3)

他们绝对玩得很好。我已经构建了一个在20个服务器的集群上运行的API。它是一个mojo应用程序,它也使用了消耗多个角色的moose类。

我采用的方法是将应用程序正确分层,直到存储层。在这方面,mojo仅在堆栈的上层才真正需要。在早期,我创建了一个基于moose的请求对象,然后将其向下推送到堆栈中。向下,创建一个基于驼鹿的响应对象,该响应对象将响应传递回堆栈的上层。最后,mojo接管并处理最终的json响应。

我们通过堆栈推动了大量的生产流量,并且表现非常出色。我做的一件事是确保尽可能使用XS版本的模块,因为这提高了堆栈的性能。