我在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;
我做错了什么?
答案 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中的代码是正确的(但实际上并没有使用这两个参数)。