我有一个名为Mobile::Auth
的模块来授权并重定向到登录页面。我希望在我的Site::Auth
中访问Mobile::Auth
中的所有方法,但方法redirect_to_login_page
除外,我有Mobile::Auth
特定方法。
我做了这样的事......
package Mobile:Auth;
use base Site::Auth;
sub redirect_to_login_page{
#get_my_mobile_specific
}
1;
在我的Mason组件文件中我放了..
use Mobile::Auth;
Mobile::Auth::authorize($args);
以下是我Site::Auth
的样子
package Site::Auth;
....
sub authorize {
#.....
if (!$authorize) {
redirect_to_login_page($args);
}
}
sub redirect_to_login_page{
# redirect to the login page
}
1;
授权有效,但我的问题是,当我从authorize
调用Mobile::Auth
方法时,它应调用Site::Auth::authorization
方法而Mobile::Auth::redirect_to_login_page
代替Site::Auth::redirect_to_login_page
伙计们,任何人都可以告诉我如何做到这一点。提前谢谢。
答案 0 :(得分:2)
Mobile :: Auth没有授权子。
Mobile::Auth::authorize($args)
鉴于你所展示的,应该死。
正如Daxim指出的那样,你没有使用方法语法,因此没有调用perl的方法调度。您有两种方法可以解决此问题。
第一种方法是调用你真正想要的那个,即
Site::Auth::authorize($args)
接着是
Mobile::Auth::redirect_to_login_page
但是,如果您正在尝试执行此操作,我认为您可以尝试使用包方法(这种方法不如对象方法常见,但至少是正确的):
package Site::Auth;
#....
sub authorize {
my ( $self, @args ) = @_;
my $authorized = $self->validate_credentials(@args);
if( !$authorized ) {
$self->redirect_to_login_page(@args);
}
}
sub redirect_to_login_page{
my ( $self, @args ) = @_;
# redirect to the login page
}
sub validate_credentials {
my ( $self, @args ) = @_;
# This is what you had in #..... before
return $authorized
}
1;
package Mobile:Auth;
use base 'Site::Auth';
sub redirect_to_login_page {
my ( $self, @args ) = @_;
#...
}
1;
### in Mason
use Mobile::Auth;
Mobile::Auth->authorize($args);
请注意一些变化:Site :: Auth :: authorize()现在希望$ self成为第一个参数,而Mobile :: Auth现在使用 - >调用authorize。 operator,这是方法调用语法。 ::和 - >之间的区别这里很大。首先,当您使用 - >调用函数时,我们将其称为“方法”而不是“子”。其次,该方法总是作为第一个参数传递“$ self”。对于package方法,$ self只是一个包含包名称的字符串。对于对象,$ self是对象的引用。第三,使用您在此处尝试使用的OO层次结构调度方法。
现在您将注意到Mobile :: Authorize定义了自己的redirect_to_login_page(),但没有定义validate_credentials()或authorize()子。 (严格地说,你不必为后面的内容分解validate_credentials(),但是你应该这样做,所以我做了。)
它是如何工作的? Mobile :: Auth-> authorize()向上传播,直到找到Site :: Auth->授权,然后调用它。 Site :: Auth-> authorize将$ self称为“Mobile :: Auth”。它调用Mobile :: Auth-> validate_credentials,perl最终将调度为Site :: Auth-> validate_credentials。然后它调用Mobile :: Auth-> redirect_to_login_page,它实际上是在Mobile :: Auth包中定义的,所以它从那里被调用。
此外,您确实需要阅读http://perldoc.perl.org/perlobj.html封面封面。这应该为您提供perl中对象的基础知识。
答案 1 :(得分:1)
一个问题是你需要引用父类:
use base 'Site::Auth';
如果您有use strict;
,那么您的代码就会出错:)
BTW ...你在标签中提到Moose
但代码示例没有使用它。
/ I3az /