我有一个现有的应用程序(我的网站),我正在做一些整理的代码,而整齐的是跟Mojo::Pg
示例here一样的想法,有单独的模型和控制器文件来保持定义。我的网站访问Flickr和Last.fm的API,我在Site::Helpers
中定义了一个帮助器:
$app->helper(
get_base_rest_url => sub {
my ( $self, $config ) = @_;
sswitch ( $config ) {
case 'photos': {
my $base_url = 'https://api.flickr.com/services/rest/';
my $user_id = '7281432@N05';
my $api_key = $self->app->config->{ 'api_token' }{ 'flickr' };
my $url =
"$base_url"
. "?user_id=$user_id"
. "&api_key=$api_key"
. "&per_page=" . $self->session->{ per_page }
. '&format=json'
. '&nojsoncallback=1';
return $url;
}
case 'music': {
my $base_url = 'https://ws.audioscrobbler.com/2.0/';
my $username = 'virtualwolf';
my $api_key = $self->app->config->{ 'api_token' }{ 'last_fm' };
my $per_page = $self->session->{ 'per_page' };
my $url = "$base_url?user=$username&limit=$per_page&api_key=$api_key&format=json";
return $url;
}
}
}
);
我遇到的问题是我不知道如何从Site::Model::Photos
模块访问该帮助程序。错误是
Can't locate object method "get_base_rest_url" via package "Site::Model::Photos"
这是公平的,但我无法弄清楚如何实际获得get_base_rest_url
帮助(或者,如何访问api_token
配置。)
答案 0 :(得分:3)
问题是你的模块没有获得访问你的应用程序的app属性/方法。
因此,当您创建Site::Model::Photos
的实例时,您需要在param中将app
传递给它并使其弱化:
package Site::Model::Photos
use Scalar::Util 'weaken';
sub new {
my $class = shift;
my $app = shift;
my $hash = {app => $app, ...};
weaken $hash->{app};
return bless $hash, $class;
}
sub your_method {
my $self = shift;
$self->{app}->get_base_rest_url(...);
}
1;
或者您可以使用此模块https://metacpan.org/release/Mojolicious-Plugin-Model为您执行此操作:
package Site::Model::Photos
use Mojo::Base 'MojoX::Model';
... code of your module ...
sub your_method {
my $self = shift;
$self->app->get_base_rest_url(...);
}
1;
在你的App.pm中需要添加:
$app->plugin('Model', {namespaces => ['Site::Model']});
在控制器中使用它:
$c->model('photos');
$c->app->model('photos');