例如,我有一个带“auto”的控制器:
package Controller::User;
sub auto :Private {
my ($self, $c) = @_;
$c->log->debug('Hello!');
return 1;
}
我想在另一个控制器中自动使用此自动方法(但不是全部)。比方说,在Controller :: My,Controller :: Dashboard等中。 而且我有不同的控制器,我不需要使用这个“自动”动作。
是否可以从另一个内部的特殊控制器“继承”此操作?
答案 0 :(得分:2)
我认为你可以将你的auto方法放在一个基本控制器中并从你想要拥有该方法的控制器中继承:
https://metacpan.org/pod/Catalyst::Manual::ExtendingCatalyst#Controllers
您也可以使用仅包含自动方法的控制器角色,并将其应用于您想要的任何控制器:
答案 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
。