无法从Perl

时间:2018-03-02 12:08:27

标签: perl mojolicious strawberry-perl

我在perl中有子程序接受参数。现在我尝试使用以下代码从配置文件中读取。

sub user{
    my $self = shift;
    my $apiBaseUrl = $self->app->config->{"apiBaseUrl"};
    my $apiToken = $self->app->config->{"apiToken"};
}

但我收到了错误

  

无法通过软件包“test@example.com”找到对象方法“app”(也许您忘记加载“test@example.com”?)

我传递给子程序的参数是$username$password

这就是我通过电子邮件和密码从登录表单中调用该子例程的方式。

my $username = $self->param('username'); 
my $password = $self->param('password');
user($username, $password);

以下是文件中的完整代码。

    use Mojo::Base 'Mojolicious::Controller';
    use Mojo::UserAgent;

sub is_logged_in {
    my $self = shift;

    return 1 if $self->session('logged_in');

    $self->render(
        inline => "<h2>Forbidden</h2><p>You're not logged in. <%= link_to 'Go to login page.' => 'login_form' %>",
        status => 403
    );
}


sub user {
    my ($username, $password) = @_;
    my $self = shift;
    my %returnResult;
    my $apiBaseUrl = $self->app->config->{'apiBaseUrl'};
    my $apiToken = $self->app->config->{'apiToken'};
    my $url = $apiBaseUrl.'/auth/login/check?email='.$username.'&password='.$password.'';
    my $header = {'api-token' => $apiToken};

    my $ua = Mojo::UserAgent->new;
    my $res = $ua->post( $url => $header )->result;
    if($res->is_success)
    {
        my $content= $res -> json;
        my $decoded_email = $content->{'email'};

        $returnResult{'fn'} = $content->{'fn'};
        $returnResult{'ln'} = $content->{'ln'};
        $returnResult{'roles'} = $content->{'roles'};
        if($username eq $decoded_email)
        {$returnResult{'logged_in'} = 1;}
        else
        {$returnResult{'logged_in'} = 0;}
        return %returnResult;

    }
    else
    {
        return $res->status_line;
    }
}


sub on_user_login {

    my $self = shift;
    my $username = $self->param('username');
    my $password = $self->param('password');
    my %userDetails = user($username, $password);

        if ($userDetails{'logged_in'} == 1) {

        $self->session(logged_in => 1);
        $self->session(username => $username);
        $self->session(userDetails => \%userDetails);
        $self->redirect_to('restricted');
    } else {
        $self->flash(message => 'Incorrect username/password!');
        $self->redirect_to('/');
    }
}

1;

我做错了什么?

1 个答案:

答案 0 :(得分:1)

my $username = $self->param('username'); 
my $password = $self->param('password');
user($username, $password);

您使用的是user子作为功能,而不是方法。 Perl是一种非常灵活的编程语言,允许您在同一程序中混合功能,过程和面向对象的编程风格。有时候会让人感到困惑。

当sub有$self作为第一个参数时,你可以在Perl中识别OOP(面向对象编程),因为有一个约定总是像这样命名对象本身。其他语言使用this代替。另一个赠品是当有一个变量后跟一个箭头->后跟一个标识符。

$obj->method(@args);

当您从$self获取参数时,您已经在代码中完成了这项工作。我怀疑你在Mojolicious :: Controller中使用它,并且你已将sub user放在同一个文件中。

您看到的错误消息是因为您对函数的第一个参数是$username中的电子邮件地址。你遗漏了$self->部分,它告诉Perl将其称为$self上的方法。在引擎盖下,它会查看左侧的标识符($self)以查看该类具有的类。然后,它将查看该类的继承树中所有内容的名称空间(在Perl中称为 packages ),以在右侧找到标识符({{{ 1}})。在我们的例子中,它会在同一个包中找到一个子user权限。然后它调用该函数user并将左侧的东西(user)作为第一个参数传递,并将$self$username作为第二个和第三个参数传递。

所以你需要做的是:

$password

你的sub中的代码是正确的(但实际上并没有使用这两个参数)。