我有一个名为Mobile::Auth的模块来授权并重定向到登录页面。我想在我的Mobile::Auth中访问来自Site::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;授权是有效的,但我的问题是,当我从Mobile::Auth调用authorize方法时,它应该调用Site::Auth::authorization方法和Mobile::Auth::redirect_to_login_page,而不是Site::Auth::redirect_to_login_page
伙计们,任何人都能告诉我怎么做。提前谢谢。
发布于 2010-07-22 20:45:30
Mobile::Auth没有授权sub。
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现在使用->操作符调用authorize,这是方法调用语法。这里的::和->之间的差别很大。首先,当你用->调用一个函数时,我们称它为“方法”而不是"sub“。其次,始终将"$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中的对象有基本的了解。
发布于 2010-07-22 16:34:55
一个问题是您需要引用父类:
use base 'Site::Auth';如果您有use strict;,那么您的代码将会出现错误:)
顺便说一句。您在标记中提到了Moose,但是代码示例没有使用它。
/I3az/
https://stackoverflow.com/questions/3306366
复制相似问题