我见过的所有与Dancer2和数据库连接相关的代码示例都将所有Dancer2代码直接放在附加到各种' get'的匿名子程序中。和'放'要求。
我想以一种方式组织我的代码,myServices.pm文件本质上只是包含正在执行的内容的其他代码文件的路由器。我可以在MyServices :: Submission模块中成功使用params关键字。但是,我似乎无法在此上下文中使用Dancer2 :: Plugin :: 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;
致电/直接返回'成功' 对/ indirect的调用返回错误500 - 内部服务器错误消息"无法提供设置即可获得数据库连接!"。然后打印出我的设置,包括正确的数据库配置。
我的配置文件必须正常,因为对/ direct的调用是成功的。
Q' S:
答案 0 :(得分:3)
当您在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。