首页 > 解决方案 > Catalyst/Moose:使日志对象始终对外部模块可用

问题描述

我有一个大型 Catalyst 应用程序,它有自己的日志系统(除了内置的 Catalyst 日志);设置例程使日志对象在存储中可用$c->stash->{log}. (不同的控制器有不同的日志对象,输出到不同的地方。)

这个应用程序有一个大的实用程序包,有许多处理各种任务的一般小功能(沿着get_name_from_idorcleanse_inputconvert_date)。这个包专门用于这个 Catalyst 应用程序,即它不被任何外部应用程序共享。

有没有一种方法可以让整个 Utilities 包都可以使用日志对象,而不必每次都手动传递它?我认为有一些整洁的 Moose 方法可以做到这一点,但我的 Moose-fu 很差......

标签: perlmoosecatalyst

解决方案


不要把它放在藏匿处。拆分实用程序库。在需要共享功能的地方使用角色。

package Loggable {
    use Moose::Role;
    sub log {
        ... # implementation goes here
    }
}

package SomeController {
    use Moose;
    with 'Loggable';

    ...
}

my $c = SomeController->new;
$c->can('log') # true

推荐阅读