【问题标题】:Accessing Mojolicious helpers from a module using Mojo::Base?使用 Mojo::Base 从模块访问 Mojolicious 助手?
【发布时间】:2015-03-29 04:01:20
【问题描述】:

我有一个现有的应用程序(我的网站),我正在做一些代码整理,整理的思路与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 配置)。

【问题讨论】:

  • 使用URI 模块(可能还有URI::QueryParam)来构建详细的URL。此外,您不应该将简单的标量变量放在引号内,如"$base_url",只是$base_url 是正确的。很抱歉,这与您所说的问题无关,但我希望您能接受建议
  • 啊,好建议。干杯!

标签: perl mojolicious


【解决方案1】:

问题是您的模块没有应用程序属性/方法来访问您的应用程序。

因此,当您创建 Site::Model::Photos 的实例时,您需要在参数中将 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');

【讨论】:

  • 第一个建议只是给了我一个“不能削弱非引用”错误,但第二个有效。谢谢!
  • 第一个例子应该可以工作。我有一个证明:gist.github.com/Logioniz/ce2b53c9647cf0204e81 运行:perl 1.pl get / 结果必须是“zxc”
  • 我还将第二个变体与 Mojolicious-Plugin-Model 一起使用!因为经常需要将 $app 传递给模块。
猜你喜欢
  • 2011-08-29
  • 1970-01-01
  • 2015-01-29
  • 2011-03-12
  • 2016-03-04
  • 1970-01-01
  • 1970-01-01
  • 2015-03-28
  • 1970-01-01
相关资源
最近更新 更多