【问题标题】:How can I use Dancer2::Plugin::Database when my code is split into multiple files?当我的代码被拆分为多个文件时,如何使用 Dancer2::Plugin::Database?
【发布时间】:2016-05-04 22:30:12
【问题描述】:

我看到的所有与 Dancer2 和数据库连接相关的代码示例都将所有 Dancer2 代码直接放在附加到各种“get”和“put”请求的匿名子例程中。

我想以 myServices.pm 文件本质上只是一个路由到包含正在执行的内容的其他代码文件的方式来组织我的代码。我可以在 MyServices::Submission 模块中成功使用 params 关键字。但是,在这种情况下,我似乎无法使用 Dancer2::Plugin::Database 中的 database 关键字。

myServices.pm:

package myServices;

use Dancer2;
use Dancer2::Plugin::REST;
use Dancer2::Plugin::Database;
use Data::Dumper;
use MyServices::Submission;

get '/direct' => sub {
    my $dbh = database;
    return 'success';
};

get '/indirect' => sub {
   MyServices::Submission::databaseTest();
};

true;

MyServices/Submission.pm:

package MyServices::Submission;

use Dancer2;
use Dancer2::Plugin::REST;
use Dancer2::Plugin::Database;
use Data::Dumper;


sub databaseTest{
    my $dbh = database;
    return 'success';
}

true;

对 /direct 的调用返回“成功”。
对 /indirect 的调用返回错误 500 - 内部服务器错误,并显示消息“如果没有提供设置,就无法获得数据库连接!”。然后它会打印出我的设置,包括正确的数据库配置。

我的配置文件一定没问题,因为调用 /direct 是成功的。

问:

  1. 其他人可以复制这种行为吗? (确保我没有失踪 很明显的东西。)
  2. 有没有办法在 MyServices::Submission 模块中成功使用 Dancer2::Plugin::Database,或者 我是否需要搜索另一个数据库连接解决方​​案才能 满足我的代码组织需求?

【问题讨论】:

  • 我注意到的第一件事是,您的模块没有返回真实值。将1; 作为每一行的最后一行。
  • 相关的网络服务器错误日志条目可能会对问题有一些有价值的输入......
  • 当您在提交模块中调用use Dancer2; 时,您实际上是在创建一个单独的 Dancer2 应用程序。见What's in an appname?
  • @ThisSuitIsBlackNot 谢谢!那正是我的问题。提交答案,我会接受。

标签: perl dancer


【解决方案1】:

当您在 MyServices::Submission 中调用 use Dancer2; 时,you're actually creating a separate Dancer2 app:

只要您导入Dancer2(通过调用use Dancer2),您就可以创建一个Dancer2 应用程序。它将使用您的类名(由 Perl 中的包函数或 Perl 中的默认值定义:main)来定义 Dancer2 应用程序名称。这就是 Dancer2 识别您的应用程序的方式。

这引入了一个有趣的情况。如果您希望将您的应用程序分成多个文件,您实际上是在创建多个应用程序。

那又怎样?

这意味着在一个应用程序中定义的任何引擎,因为该应用程序是一个完全独立的范围,将不能用于不同的应用程序:

package MyApp::User {
      use Dancer2;
      set serializer => 'JSON';
      get '/view' => sub {...};
 }

package MyApp::User::Edit {
     use Dancer2;
     get '/edit' => sub {...};
 }

这是两个不同的 Dancer2 应用程序。它们有不同的范围、上下文,因此也有不同的引擎。虽然 MyApp::User 定义了一个序列化程序(JSON 序列化程序),但 MyApp::User::Edit 将没有该配置。


您可以在导入 Dancer2 时使用appname 选项来表示您的模块应该扩展应用程序而不是创建新应用程序:

package MyServices::Submission;

use Dancer2 appname => 'MyApp';
use Dancer2::Plugin::Database;

sub databaseTest {
    my $dbh = database;                                 
    return 'success';
}

1;

现在主应用程序的配置和引擎将在 MyServices::Submission 中可用。您甚至可以在此处添加其他路线。


顺便说一句,像这样拆分您的应用程序是个好主意;如果您对其他技术感兴趣,Dancer 用户邮件列表中的某个人在how to organize medium- to large-scale Dancer applications 上写了一些非常全面的建议。建议分为六个部分;有关完整列表,请参阅 here

【讨论】:

  • 谢谢!非常有帮助。你回答了我的数据库连接问题和我的代码组织问题。
  • 不客气。如果您对有关组织 Dancer 代码的更多提示感兴趣,请参阅我在上次编辑中添加到帖子末尾的链接。这只是一个特定的 Dancer 用户喜欢做事的方式,但它可能会给你一些想法。有几个不同的部分,我只是链接到第一个。
  • 我不明白为什么你不能把 Dancer2::Plugin::Database 放在主 myServices.pm 应用程序中。我可以use myServices.pm 中的其他模块,它们将自动包含在 MyServices::Sumbission 应用程序中,但插件不会。你必须明确地use它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-14
  • 1970-01-01
  • 2010-11-13
  • 1970-01-01
  • 2014-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多