Катализатор требует полной загрузки всего приложения

Итак, у меня есть файл.lib с некоторыми из моих собственных подпрограмм, которые я хотел бы сделать доступными для всего приложения Catalyst. Сейчас мне нужен файл в lib / myapp.pm, и у меня нет проблем. Однако всякий раз, когда я пытаюсь вызвать эту подпрограмму в контроллере, я получаю эту ошибку:

"Undefined subroutine &myapp::Controller::Root::my_sub called at 
/home/user/myapp/lib/myapp/Controller/Root.pm line 35, <DATA> line 1003."

Если мне требуется файл, который я хочу требовать в контроллере, это не дает мне никаких проблем. Однако я бы предпочел загружать его только в одном месте для всего приложения, если это было возможно. Кроме того, если мне требуется файл в контроллере, означает ли это, что этот файл загружается каждый раз, когда делается запрос? (Я использую mod_perl, если это имеет какое-либо значение). Я хотел бы сделать это максимально эффективным с точки зрения загрузки файла один раз для всего приложения и любых запросов, а также загрузки только в одном месте только ради чистого кода. Спасибо!

2 ответа

Решение
use myapp;

в основном

BEGIN {
   require myapp;
   import myapp;
}

require myapp; исполняет myapp.pm если это еще не было выполнено. Другими словами, независимо от того, сколько раз вы делаете use myapp; в процессе файл будет выполнен ("загружен") только один раз.

import myapp; звонки myapp::import() если это существует для того, чтобы экспортировать вещи. Если предположить, myapp экспорт my_subВот почему ваш код не работает.

У вас есть два варианта.

  1. Позвоните mysub в myapp пакет: myapp::my_sub(...),
  2. использование use myapp; создать локальное имя для my_sub в каждой посылке my_sub так что вы можете позвонить, используя только my_sub(...), (Это предполагает myapp экспорт my_sub.)

Команда use myapp; загрузит ваш файл myapp.pm только один раз, даже если он вызывается несколько раз. Но каждый раз, когда она вызывает подпрограмму импорта, становится доступной функция my_sub() (при условии, что вы экспортируете ее с помощью Exporter или чего-то еще) без необходимости писать myapp::my_sub().

Другие вопросы по тегам