1

Mobile::Auth承認してログインページにリダイレクトするために呼び出されたモジュールがあります。私は、Site::AuthMobile::Authの.redirect_to_login_pageMobile::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_pageSite::Auth::redirect_to_login_page

みんな、誰でもこれを行う方法の手がかりを教えてくれます。前もって感謝します。

4

2 に答える 2

2

Mobile::Auth には認可サブがありません。

Mobile::Auth::authorize($args)

あなたが示したことを考えると、死ぬべきです。

Daxim が指摘したように、メソッド構文を使用していないため、perl のメソッド ディスパッチを呼び出していません。これを修正するには、2 つのオプションがあります。

最初の方法は、実際に必要なサブルーチンを呼び出すことです。

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 を呼び出すようになりました。:: と -> here の違いは大きいです。まず、-> で関数を呼び出すときは、「サブ」ではなく「メソッド」と呼びます。次に、メソッドには常に最初の引数として「$self」が渡されます。パッケージ メソッドの場合、$self はパッケージの名前を含む単なる文字列です。オブジェクトの場合、$self はオブジェクトへの参照です。3 番目に、ここで使用しようとしている 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

1 つの問題は、親クラスを引用する必要があることです。

use base 'Site::Auth';

あなたがuse strict;存在していた場合、あなたのコードでエラーが発生したでしょう:)

ところで...あなたはMooseタグで言及していますが、コード例ではそれを使用していません。

/I3az/

于 2010-07-22T08:34:55.467 に答える