1

我调用了模块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;

在我的梅森组件文件中我放了..

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

伙计们,任何人都可以给我一个线索如何做到这一点。提前致谢。

4

2 回答 2

2

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 中对象的基础知识。

于 2010-07-22T12:45:29.977 回答
1

一个问题是您需要引用父类:

use base 'Site::Auth';

如果您use strict;在场,那么您的代码会出错:)

顺便说一句...您Moose在标签中提到但代码示例没有使用它。

/I3az/

于 2010-07-22T08:34:55.467 回答