当我的代码被拆分成多个文件时,如何使用Dancer2 :: Plugin :: Database?

时间:2016-05-03 19:28:58

标签: perl dancer

我见过的所有与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:

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

1 个答案:

答案 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