Catalyst,从其他的特殊控制器运行“自动”动作

时间:2016-01-06 14:35:39

标签: perl catalyst

例如,我有一个带“auto”的控制器:

package Controller::User;

sub auto :Private {
   my ($self, $c) = @_;

   $c->log->debug('Hello!');

    return 1;
}

我想在另一个控制器中自动使用此自动方法(但不是全部)。比方说,在Controller :: My,Controller :: Dashboard等中。 而且我有不同的控制器,我不需要使用这个“自动”动作。

是否可以从另一个内部的特殊控制器“继承”此操作?

2 个答案:

答案 0 :(得分:2)

我认为你可以将你的auto方法放在一个基本控制器中并从你想要拥有该方法的控制器中继承:

https://metacpan.org/pod/Catalyst::Manual::ExtendingCatalyst#Controllers

您也可以使用仅包含自动方法的控制器角色,并将其应用于您想要的任何控制器:

http://www.catalystframework.org/calendar/2011/10

答案 1 :(得分:2)

由于Catalyst使用Moose,而Catalyst :: Controller对象是Moose对象,因此可以使用Moose角色。

package Hello::DebugRole;
use Moose::Role;
use MooseX::MethodAttributes::Role;

sub auto :Private {
   my ($self, $c) = @_;

   $c->log->debug('Hello!');

    return 1;
}

1;

我们需要MooseX::MethodAttributes::Role来启用CODE属性。如果没有它,它会在执行时死掉,如果我们省略:Private,则Catalyst不会将其视为操作,而是将其视为本地方法。

这种方法很有意义,因为您可以在一个地方定义auto操作,这很干,并且您可以在所有需要的地方重复使用该代码。

现在您可以在所需的所有控制器中使用它。只需将其放在BEGIN块中即可。

package Hello::Controller::User;
use Moose;
use namespace::autoclean;

BEGIN { extends 'Catalyst::Controller'; with 'Hello::DebugRole'; }

如果我导航到该控制器,日志将如下所示:

[debug] Path is "user"
[debug] "GET" request for "user/" from "127.0.0.1"
[debug] Hello!
[debug] Response Code: 200; Content-Type: text/html; charset=utf-8; Content-Length: unknown
[info] Request took 0.010909s (91.667/s)
.------------------------------------------------------------+-----------.
| Action                                                     | Time      |
+------------------------------------------------------------+-----------+
| /user/auto                                                 | 0.000237s |
| /user/index                                                | 0.000152s |
| /end                                                       | 0.000394s |
'------------------------------------------------------------+-----------'

[info] *** Request 2 (0.286/s) [24045] [Wed Jan  6 16:16:15 2016] ***

但如果我导航到Foobar控制器,则没有自动操作,也没有 Hello!

[info] *** Request 3 (0.250/s) [24045] [Wed Jan  6 16:16:20 2016] ***
[debug] Path is "foobar"
[debug] "GET" request for "foobar/" from "127.0.0.1"
[debug] Response Code: 200; Content-Type: text/html; charset=utf-8; Content-Length: unknown
[info] Request took 0.007135s (140.154/s)
.------------------------------------------------------------+-----------.
| Action                                                     | Time      |
+------------------------------------------------------------+-----------+
| /foobar/index                                              | 0.000181s |
| /end                                                       | 0.000179s |
'------------------------------------------------------------+-----------'

请注意,Catalyst将调用所有涉及的控制器的auto个动作,因此如果所有请求中有一个,它也会执行Root控制器的auto