无法从Perl中的app.conf文件中读取

问题描述 投票:-2回答:1

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

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

但是我收到了错误

无法通过包“[email protected]”找到对象方法“app”(也许你忘了加载“[email protected]”?)

我传递给子程序的参数是$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;

我究竟做错了什么?

perl mojolicious strawberry-perl
1个回答
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中称为包),以在右侧找到标识符(即user)。在我们的例子中,它将在同一个包中找到一个子user。然后它调用该函数user并将左边的东西($self)作为第一个参数传递,并将$username$password作为第二个和第三个参数传递。

所以你需要做的是:

$self->user($username, $password);

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

© www.soinside.com 2019 - 2024. All rights reserved.