2016-05-03 1 views
2

Все примеры кода, которые я видел, связанные с Dancer2 и соединениями с базой данных, помещают весь код Dancer2 непосредственно в анонимные подпрограммы, связанные с различными запросами «get» и «put».Как я могу использовать Dancer2 :: Plugin :: Database, когда мой код разбит на несколько файлов?

Я хотел бы организовать свой код таким образом, чтобы файл myServices.pm был по существу просто маршрутизатором для других файлов кода, содержащих мясо исполняемого файла. Я могу успешно использовать ключевое слово params в модуле MyServices :: Submission. Однако я не могу использовать ключевое слово базы данных из 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; 

Вызов/DIRECT возвращает 'успех'.
Вызов/косвенные возвращения Ошибка 500 - Внутренняя ошибка сервера с сообщением «Не удается получить подключение к базе данных без настроек!». Затем он распечатывает мои настройки, включая правильную конфигурацию базы данных.

Мой файл конфигурации должен быть в порядке, потому что вызов/direct имеет успех.

Q-х:

  1. Может кто-нибудь повторить это поведение? (Убедитесь, что мне не хватает что-то очевидное.)
  2. Есть ли способ успешно использовать Dancer2 :: Plugin :: Database в модуле MyServices :: Submission или Нужно ли искать другое решение для подключения db для того, чтобы удовлетворить потребности моего кода?
+0

Первое, что я заметил, это то, что ваши модули не возвращают истинное значение. Поместите '1;' как самую последнюю строку в каждом. – stevieb

+0

Соответствующие записи журнала ошибок веб-сервера, вероятно, будут иметь ценный вклад в проблему ... – stevieb

+1

Когда вы вызываете 'use Dancer2;' в своем модуле Submission, вы фактически создаете отдельное приложение Dancer2. См. [Что находится в appname?] (Http://advent.perldancer.org/2014/10) – ThisSuitIsBlackNot

ответ

3

Когда вы звоните в MyServices use Dancer2; :: Подчинение, you're actually creating a separate Dancer2 app:

Как только вы импортировать Dancer2 (по телефону use Dancer2), вы создаете Dancer2 App. Он будет использовать ваше имя класса (определенное функцией пакета в 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 не будет иметь такую ​​конфигурацию.


Вы можете использовать опцию appname при импорте Dancer2 сказать, что ваш модуль должен расширить приложение вместо создания новой один:

package MyServices::Submission; 

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

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

1; 

Теперь конфигурации и двигателей от основных приложение будет доступно внутри MyServices :: Представление. Здесь вы можете добавить дополнительные маршруты.

В качестве отложенного приложения, как и в случае с этим, прекрасная идея; если вас интересуют другие методы, кто-то из списка рассылки пользователей Dancer написал несколько довольно полных рекомендаций по how to organize medium- to large-scale Dancer applications. Рекомендации разделены на шесть частей; см. here для полного перечисления.

+1

Спасибо! Очень полезно. Вы ответили как на мою проблему с подключением к базе данных, так и на мою проблему с организацией кода. – Laura

+1

Добро пожаловать. Если вас интересуют дополнительные советы по организации вашего кода для танцоров, см. Ссылку, которую я добавил в конце своего сообщения в последнем редактировании. Это то, как один конкретный пользователь Dancer любит делать что-то, но может дать вам некоторые идеи. Есть несколько разных частей, я просто связан с первым. – ThisSuitIsBlackNot

+0

Я не понимаю, почему вы не можете просто поместить Dancer2 :: Plugin :: Database в основное приложение myServices.pm. Я могу «использовать» другие модули в myServices.pm, и они будут автоматически включены в приложение MyServices :: Sumbission, но плагина не будет. Вы должны явно использовать его. – StevieD

Смежные вопросы