2010-07-22 6 views
1

J'ai un module appelé Mobile::Auth pour autoriser et rediriger vers la page de connexion. Je voulais accéder à toutes les méthodes de Site::Auth dans mon Mobile::Auth sauf une méthode redirect_to_login_page, dont j'ai un spécifique pour mon Mobile::Auth.Appel de la méthode de classe enfant à partir de la classe de base en Perl

Je l'ai fait quelque chose comme ça ...

package Mobile:Auth; 
use base Site::Auth; 

sub redirect_to_login_page{ 
    #get_my_mobile_specific 
} 
1; 

et dans mon dossier composant Mason .. je mets

use Mobile::Auth; 
Mobile::Auth::authorize($args); 

et voici comment mon Site::Auth ressemble

package Site::Auth; 

.... 

    sub authorize { 
    #..... 
    if (!$authorize) { 
     redirect_to_login_page($args); 
    } 
    } 
    sub redirect_to_login_page{ 
    # redirect to the login page 
    } 
    1; 

Autorisation fonctionne, mais mon problème est quand j'appelle la méthode authorize de Mobile::Auth il devrait appeler Site::Auth::authorization méthode et Mobile::Auth::redirect_to_login_page au lieu de Site::Auth::redirect_to_login_page

Guys, n'importe qui peut me donner une idée comment faire cela. Merci d'avance.

+1

Ce code est sérieusement regardé pour ce que vous essayez de faire. Les fonctions OO de Perl comme [SUPER] (http://perldoc.perl.org/perlbot.html#OVERRIDING-SUPERCLASS-METHODS) fonctionnent sur les invocations de méthodes, pas sur les appels de fonctions procédurales. Vous devez redessiner ceci. – daxim

Répondre

1

Un problème est que vous devez citer la classe parente:

use base 'Site::Auth'; 

Si vous aviez use strict; présente alors vous avez une erreur avec votre code :)

BTW ... vous mentionnez Moose dans vos tags mais l'exemple de code ne l'utilise pas.

/I3az/

2

mobile :: Auth ne dispose pas d'autoriser des sous.

Mobile::Auth::authorize($args) 

devrait mourir, compte tenu de ce que vous avez montré. Comme Daxim l'a fait remarquer, vous n'utilisez pas la syntaxe de la méthode, et par conséquent, vous n'appelez pas la répartition des méthodes de Perl. Vous avez deux options pour résoudre ce problème.

La première est d'appeler le sous que vous voulez réellement, ce qui est

Site::Auth::authorize($args) 

suivie

Mobile::Auth::redirect_to_login_page 

Cependant, si vous essayez de le faire OO, et je pense vous êtes, vous pouvez essayer des méthodes de paquet (qui sont moins courantes que les méthodes d'objet, mais au moins correctes):

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); 

Veuillez noter quelques modifications: Site :: Auth :: authorize() s'attend maintenant à ce que $ self soit le premier argument, et Mobile :: Auth appelle maintenant authorize avec l'opérateur ->, qui est la syntaxe d'invocation de la méthode. La différence entre :: et -> est ici grande. Tout d'abord, lorsque vous appelez une fonction avec ->, nous l'appelons une "méthode" au lieu d'une "sous". Deuxièmement, la méthode est toujours passée "$ self" comme premier argument. Dans le cas d'une méthode de package, $ self est juste une chaîne contenant le nom du paquet. Dans le cas d'un objet, $ self est une référence à l'objet. Troisièmement, les méthodes sont distribuées en utilisant la hiérarchie OO que vous essayez d'utiliser ici.

Maintenant, vous remarquerez que Mobile :: Authorize définit son propre redirect_to_login_page() mais ne définit pas un sous-attribut validate_credentials() ou authorize(). (À proprement parler, vous ne pas tenir compte des validate_credentials() pour ce qui suit, mais vous devriez, si je l'ai fait.)

Comment ça marche? Mobile :: Auth-> authorize() parcourt la chaîne jusqu'à ce qu'il trouve Site :: Auth-> authorize, puis l'appelle. Site :: Auth-> authorize obtient $ self en tant que "Mobile :: Auth". Il appelle Mobile :: Auth-> validate_credentials, que perl distribue finalement en tant que Site :: Auth-> validate_credentials. Il appelle ensuite Mobile :: Auth-> redirect_to_login_page, qui est en fait défini dans le paquet Mobile :: Auth, de sorte qu'il est appelé à partir de là.

Aussi, vous vraiment besoin de lire http://perldoc.perl.org/perlobj.html de couverture à la couverture. Cela devrait vous donner les bases sur les objets en Perl.

Questions connexes