Mobile::Auth 没有授权子。
Mobile::Auth::authorize($args)
鉴于你所展示的,应该死。
正如 Daxim 指出的那样,您没有使用方法语法,因此没有调用 perl 的方法分派。您有两种选择来解决此问题。
第一种方法是调用你真正想要的那个 sub,即
Site::Auth::authorize($args)
其次是
Mobile::Auth::redirect_to_login_page
但是,如果您正在尝试执行此 OO,并且我认为您是,您可以尝试使用包方法(这些方法不如对象方法常见,但至少是正确的):
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 现在使用 -> 运算符调用授权,这是方法调用语法。:: 和 -> 这里的区别很大。首先,当您使用 -> 调用函数时,我们将其称为“方法”而不是“子”。其次,该方法始终作为第一个参数传递“$self”。对于包方法,$self 只是一个包含包名称的字符串。在对象的情况下,$self 是对该对象的引用。第三,使用您在此处尝试使用的 OO 层次结构分派方法。
现在您会注意到 Mobile::Authorize 定义了它自己的 redirect_to_login_page() 但没有定义 validate_credentials() 或 authorize() 子。(严格来说,你不必为接下来的内容考虑 validate_credentials() ,但你应该这样做,所以我做了。)
它是如何工作的?Mobile::Auth->authorize() 沿着链向上传播,直到找到 Site::Auth->authorize,然后调用它。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 中对象的基础知识。